perm filename CKL.MAC[CH2,ALS]1 blob sn#272112 filedate 1977-03-29 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	CKL   CHECKERS LEARNING ROUTINES  12/8/70
C00006 00003	THE FOLLOWING DEFINITIONS ARE NEEDED TO DEFINE GLOBELS.
C00010 00004	LOADTA:	PUSHJ	PDP,DFILL
C00047 00005	MACRO USED INL25B
C00065 00006
C00072 00007		SUBTTL	MACROS FOR SIGNATURE TABLES
C00075 00008	DSAVE:	INIT	7,17
C00083 00009	BLOWUP==10		RELATIVE SIZE OF INPSIZ IN L AND P
C00098 00010	FIXX:	TTYUUO	11,0
C00109 ENDMK
C⊗;
	TITLE	CKL   CHECKERS LEARNING ROUTINES  12/8/70
;WITH FIX ROUTINE ADDED
;REVISED TO REDUCE MEMORY AND DISK SIZES

	INTERN	BEGINL,CMOVE,HEADFL,LBYT,LFLAG,NOSTO
	INTERN	LXF,LZERO,TRNKNO,DIVIDE,SYM,LC,INPSIZ
	INTERN	RFILL,DFILL,DSAVE,EVAL11,LOADTA
	INTERN	WHOWON,LCONTS,LCONTZ,ZL,BEGL3
	INTERN	BOOKA,BOOKP,BOOKK,BOOKM,BOOKI,INPSIZ,INPA,INPP,INPK,LABEL
	EXTERN	FINDFI,FINDX1,X4NORM,PCCNT,PHASE,PHASEV,X4ALL,X4TAB
	EXTERN	CRIP,REVERA,REVERP,REVERK,WHERE
	EXTERN	COLOR,CFLAG,BITTAB
	EXTERN	LEGAL,MAGIN,MAGTAP,TPUNIT,OUTIN,MGIBUF,MGOBUF
	EXTERN	NOYES,NUM3,NUMOUT,OCT2,OCTOUT,RJ2,RJ4,RJOUT,SCAN,TYI
	EXTERN	TERPRI,EOL,NEWLIN,PRINT,S,SI
	EXTERN	LOSE,LPTFIX,DWFLAG
	EXTERN	PLA,PLP,PLK,PLRF,PLLF,PLRB,PLLB,PUP,ZZ,PLY
	EXTERN	PRNAME,LPFLAG,BEGIN,COMEND
	EXTERN	TA,TP,TK,TYO,LASCAR,ERR,SIDE,OJ
	EXTERN	TLIST,EEB,EEB2,USEBOK


;         REGISTER ASSIGNMENTS
;ASSIGNMENT	USAGE
Z=0
X1=1	;	INDEX MAIN
U1=2
X2=3	;	INDEX PATH
U2=4
X3=5	;	INDEX PLAUS
U3=6
X4=7	;	INDEX TWIG
U4=10
X5=11	;	PASS COLOR
U5=12
Q=13
A=14	;	ACTIVE
P=15	;	PASSIVE
K=16	;	KINGS
PDP=17	;	PUSHJ

MA:	BLOCK	300
MP:	BLOCK	300
MK:	BLOCK	300
ME:	BLOCK	300
MWL:	BLOCK	300		;WHOWON INDICATORS

OPDEF	TTYUUO	[51B8]

BEST:	Z		;BEST INDEX VALUE
X1S:	Z
X2S:	Z
SAVX2:	Z
U2SS:	Z
WHOWON:	Z
WINLOS:	Z		;COUNT OF DISTANCE TO WIN OR LOSS
BKMOVE:	Z		;BOOK MOVE SAVE
X4CNT:	Z
X4MOVE:	Z
HIGH:	BLOCK	4
LOW:	BLOCK	4
EQUAL:	BLOCK	4
THIGH:	Z
TLOW:	Z
TEQUAL:	Z
HEADFL:	-1
U4S:	Z			;TEMPORARY STORAGE
KEAR:	Z			;FLAG FOR KEAR LEARNING DATA
BOLFLG:	Z		;FLAG FOR BOLAND LEARNING DATA
LXF:	Z			;FLAG FOR LEGAL BOOK MOVE
TRNKNO:	-1			;TRUNK COUNTER
LBYT:	Z			;BYTE POINTER
LFLAG:	Z
CMOVE:	Z
COUNT:	Z
LPOINT:	Z			;POINTER FOR VARIATIONS

STIME:	SETZ	U1,
	CALL	U1,[SIXBIT /RUNTIME/]
	MOVEM	U1,TIME
	POPJ	PDP,

LTIME:	SETZ	U1,
	CALL	U1,[SIXBIT /RUNTIME/]
	SUB	U1,TIME
	ADDM	U1,LABEL
LTIME0:	ADDM	U1,TIME
	MOVEI	U2,↑D1000
	IDIVM	U1,U2
	MOVE	U1,U2
	PUSHJ	PDP,RJOUT1
	POPJ	PDP,

RTIME:	SETZ	U1,
	CALL	U1,[SIXBIT /RUNTIME/]
	SUB	U1,TIME
	JRST	LTIME0

TIME:	Z
HEADER:	ASCIZ /
	TIME    PHASE3    PHASE2    PHASE1    PHASE0     #      ALL   
	         %  %E     %  %E     %  %E     %  %E  MOVES    %  %E     
/
;THE FOLLOWING DEFINITIONS ARE NEEDED TO DEFINE GLOBELS.
;THIS SECTION TAKES THE PLACE OF PD.MAC

INTERN	TRESET,TREE,TELPAR,SIG,SETW,SETPAR,SETB,FIND,MOVIN
INTERN	ACCEPT,BDOUT,PLAYBS,PC,PB,TELLC,LTREE,GO,DEBUG
INTERN	REVERS,PW,CTOTAL,LEGM,W,D,BOUT,MESS,IA,FINDM
INTERN	CDIFF,DIFF,TOTAL,CRFST,FSTCR,LPTREE,RUNT,CRUNT,CTELLC,CSFLAG
INTERN	MOVOUT,MOVES,IP,IK,TEST,SUM,RECIN
INTERN	MOP,MOVX,EXIT1,DATA

	EXTERN	NOTICE

MOVOUT:
IP:
IK:
CDIFF:
TEST:
CRFST:
LPTREE:
CRUNT:
CTELLC:
TELPAR:
SIG:
SETW:
SETPAR:
SETB:
FIND:
MOVIN:
BDOUT:
PLAY:
PLAYBS:
PC:
PB:
GO:
DEBUG:
REVERS:
PW:
CTOTAL:
W:
D:
BOUT:
SUM:
RECIN:
EXIT1:
	JRST	NOTICE

IA:
FINDM:
DIFF:
TOTAL:
FSTCR:
RUNT:
CSFLAG:
TRESET:
TREE:
MOP:
TELLC:
MOVX:
LTREE:	Z
MESS:	ASCIZ	/
/

;FIRST LEVEL TABLE EVALUATION MACROS AND DATA


DEFINE	MACZ	(SC)	<;TABLE EVALUATION SCORE
	MOVE	Z,SIGZ1'SC(A)
	CAMN	K,A
	JRST	.+7		;DO NOT SCORE BOOK MOVE
	CAMGE	Z,SIGZ1'SC(K)
	AOS	HIGH1'SC(P)
	CAMN	Z,SIGZ1'SC(K)
	AOS	EQU1'SC(P)
	CAMLE	Z,SIGZ1'SC(K)
	AOS	LOW1'SC(P)>


TAB1E:	MACZ	1
	MACZ	2
	MACZ	3
	MACZ	4
	MACZ	5
	MACZ	6
	POPJ	PDP,

SIGZ11:	BLOCK	20
SIGZ12:	BLOCK	20
SIGZ13:	BLOCK	20
SIGZ14:	BLOCK	20
SIGZ15:	BLOCK	20
SIGZ16:	BLOCK	20

HIGH11:	BLOCK	4
HIGH12:	BLOCK	4
HIGH13:	BLOCK	4
HIGH14:	BLOCK	4
HIGH15:	BLOCK	4
HIGH16:	BLOCK	4

EQU11:	BLOCK	4
EQU12:	BLOCK	4
EQU13:	BLOCK	4
EQU14:	BLOCK	4
EQU15:	BLOCK	4
EQU16:	BLOCK	4

LOW11:	BLOCK	4
LOW12:	BLOCK	4
LOW13:	BLOCK	4
LOW14:	BLOCK	4
LOW15:	BLOCK	4
LOW16:	BLOCK	4

DEFINE	MACP	(SC)	<;PRINT MACRO
	MOVE	X2,HIGH1'SC(P)
	ADD	X2,LOW1'SC(P)
	ADD	X2,EQU1'SC(P)
	MOVEM	X2,X2S
	MOVE	X3,LOW1'SC(P)
	IMULI	X3,↑D100
	IDIV	X3,X2
	MOVE	U1,X3
	PUSHJ	PDP,RJOUT3
	MOVE	X3,HIGH1'SC(P)
	IMULI	X3,↑D100
	MOVE	X2,X2S
	IDIV	X3,X2
	MOVE	U1,X3
	SETZM	HIGH1'SC(P)
	SETZM	EQU1'SC(P)
	SETZM	LOW1'SC(P)
	PUSHJ	PDP,RJOUT1>

TAB1P:	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /TABLE	   L11H      L12H      L13H      L14H      L15H      L16H
/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	MOVEI	P,3
TAB1P1:	MOVEI	U1,[ASCIZ /PHASE/]
	PUSHJ	PDP,PRINT
	MOVE	U1,P
	PUSHJ	PDP,NUMOUT
	MACP	1
	MACP	2
	MACP	3
	MACP	4
	MACP	5
	MACP	6
	PUSHJ	PDP,TERPRI
	SOJGE	P,TAB1P1
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

LOADTA:	PUSHJ	PDP,DFILL
BEGINL:	PUSHJ	PDP,TERPRI
	SETOM	TRNKNO
	SETOM	HEADFL
	MOVEI	U1,1
	MOVEM	U1,SI
	SETOM	LCONTF#
	MOVEI	U1,[ASCIZ /DEPTH (0 1 2 OR 3)?:/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,SCAN
	PUSHJ	PDP,EOL
	JRST	.-4
	CAIG	U1,3
	SKIPGE	U1
	JRST	.-7
	MOVEM	U1,LDEPTH
	ADDI	U1,3		;ALLOW 3 MORE
	MOVEM	U1,KDEPTH
	SETZM	LFLAG6
	MOVEI	U1,[ASCIZ /WANT LINEAR DATA? :/]
	PUSHJ	PDP,PRINT
	SETZM	LFLAG1
	PUSHJ	PDP,NOYES
	JRST	SSD
	SETOM	LFLAG1
	MOVEI	U1,[ASCIZ /    REPORT TERMS? :/]
	PUSHJ	PDP,PRINT
	SETOM	LFLAG5
	PUSHJ	PDP,NOYES
	SETZM	LFLAG5
SSD:	MOVEI	U1,[ASCIZ /CHANGE WEIGHTS?:/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,NOYES
	JRST	BEGL2
	MOVEI	U1,[ASCIZ /LINEARIZE FIRST LEVEL ? :/]
	PUSHJ	PDP,PRINT
	SETZM	LFLAG2
	PUSHJ	PDP,NOYES
	JRST	SSD1
	SETOM	LFLAG2
	MOVEI	U1,[ASCIZ /CR OR TYPE WEIGHT :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,SCAN
	PUSHJ	PDP,EOL
	JRST	.+5
	MOVEM	U1,WEIGHT
	MOVNS	U1
	HRRM	U1,L9A
	JRST	.+6
	MOVEI	U1,[ASCIZ /     WEIGHT IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,WEIGHT
	PUSHJ	PDP,RJOUT1
	PUSHJ	PDP,TERPRI
SSD1:	MOVEI	U1,[ASCIZ /SYM SMOOTH FIRST LEVEL :/]
	PUSHJ	PDP,PRINT
	SETZM	LFLAG7
	PUSHJ	PDP,NOYES
	JRST	SSD2
	SETOM	LFLAG7
	MOVEI	U1,[ASCIZ /TYPE FIRST SHIFT :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,SCAN
	PUSHJ	PDP,EOL
	JRST	.+5
	MOVEM	U1,WEIGH1
	MOVNS	U1
	HRRM	U1,L10B
	JRST	.+6
	MOVEI	U1,[ASCIZ /SYM WEIGHT IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,WEIGH1
	PUSHJ	PDP,RJOUT1
	PUSHJ	PDP,TERPRI
SSD2:	MOVEI	U1,[ASCIZ /SYM SMOOTH SECOND LEVEL :/]
	PUSHJ	PDP,PRINT
	SETZM	LFLAG8
	PUSHJ	PDP,NOYES
	JRST	SSD3
	SETOM	LFLAG8
	MOVEI	U1,[ASCIZ /TYPE SECOND SHIFT :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,SCAN
	PUSHJ	PDP,EOL
	JRST	.+5
	MOVEM	U1,WEIGH2
	MOVNS	U1
	HRRM	U1,AC3
	JRST	.+6
	MOVEI	U1,[ASCIZ /SYM WEIGHT IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,WEIGH2
	PUSHJ	PDP,RJOUT1
	PUSHJ	PDP,TERPRI
SSD3:	MOVEI	U1,[ASCIZ /SYM SMOOTH THIRD LEVEL :/]
	PUSHJ	PDP,PRINT
	SETZM	LFLAG9
	PUSHJ	PDP,NOYES
	JRST	BEGL2
	SETOM	LFLAG9
	MOVEI	U1,[ASCIZ /TYPE THIRD SHIFT :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,SCAN
	PUSHJ	PDP,EOL
	JRST	.+5
	MOVEM	U1,WEIGH3
	MOVNS	U1
	HRRM	U1,L34B
	JRST	BEGL2
	MOVEI	U1,[ASCIZ /SYM WEIGHT IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,WEIGH3
	PUSHJ	PDP,RJOUT1
	PUSHJ	PDP,TERPRI
BEGL2:	SETZM	PRNVAR
	SETZM	DSKTAP
	SETZM	MGIBUF
BEGL4:	MOVEI	U1,[ASCIZ /TYPE B, K, OR L :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TYI
	CAIE	U1,12
	CAIN	U1,15
	JRST	.-3
	CAIN	U1,"B"
	JRST	BEGLB
	SETZM	BOLFLG		;NOT BOLAND
	CAIN	U1,"K"
	JRST	BEGLK
	CAIN	U1,"L"
	JRST	BEGLL
	JRST	BEGL3

BEGLB:	MOVE	U1,[SIXBIT /BOLAND/]
	MOVEM	U1,DATAG
	SETOM	BOLFLG		;SET FLAG 
	MOVEI	U1,[ASCIZ /BOLAND WILL BE USED/]
	JRST	.+10
BEGLK:	MOVE	U1,[SIXBIT /KEARS/]
	MOVEM	U1,DATAG
	MOVEI	U1,[ASCIZ /KEARS WILL BE USED/]
	JRST	.+4
BEGLL:	MOVE	U1,[SIXBIT /LEES/]
	MOVEM	U1,DATAG
	MOVEI	U1,[ASCIZ /LEES WILL BE USED/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TYI
	CAIE	U1,15
	JRST	.-2
BEGL3:	PUSHJ	PDP,DSKINI
	JRST	BEGL4
GETGO:	MOVEI	Z,777777
	MOVEM	Z,CFLAG
	SETZM	TRUNKF
	MOVEI	U1,[ASCIZ /  TRUNK NAMES?  : /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,NOYES
	JRST	.+2
	SETOM	TRUNKF
	SETZM	HIGH
	SETZM	LOW
	SETZM	EQUAL
	SETZM	THIGH
	SETZM	TLOW
	SETZM	TEQUAL
	SETZM	HEADFL
	SOS	HEADFL
	SETZM	COUNT		;INITIALIZE FOR LEARNING
	PUSHJ	PDP,STIME
		;ASK TELETYPE WHERE TO START--IF NOT AT FRONT, THEN
		;RESET TRNKNO.  SKIP OVER TRNKNO NUMBER OF TRUNKS NOW.
	MOVEI	U1,[ASCIZ /  TRUNK NUMBER? : /]
	PUSHJ	PDP,PRINT
	MOVEI	U1,1
	PUSHJ	PDP,SCAN	;GOBBLE UP CR
	PUSHJ	PDP,EOL		;SCAN CHAR.
	JRST	BEGIN3		;CR
	SOS	U2,U1		;NUMBER
	MOVEM	U1,TRNKNO	;STARTING TRUNK NO.
	SETZM	KEAR		;TURN OFF KEAR LEARNING FLAG
LB1:	PUSHJ	PDP,NEWLIN	;FIRST CHAR. OF CARD IMAGE IN U1
	SKIP			;EOF
	CAIN	U1,"<"		;LEES OR TESCHELEIT LEARNING DATA?
	SETZM	KEAR		;YES, SO SET FLAG TO 0
	CAIN	U1,"!"		;KEAR LEARNING DATA?
	AOS	KEAR		;YES, SO SET FLAG
	CAIN	U1,"&"
	JRST	.+3
	CAIE	U1,"#"		;A "#"?
	JRST	LB1		;NO
	SOJGE	U2,LB1		;YES, BUT IS IT PROPER TRUNK CARD?
	PUSHJ	PDP,COMM1
	SETZM	X2		;YES
	SETOM	LRNJMP		;TO SKIP DATA UPDATE FIRST TIME
	JRST	LTR

COMM2:	SOJG	U2,COMM+1
	MOVEI	X1,15
	PUSHJ	PDP,TYO
	JRST	COMM3

COMM:	MOVEI	U2,26
	PUSHJ	PDP,MAGIN	;GET NEXT CHAR.
	JRST	ENDERR		;EOF NOT EXPECTED HERE
	MOVE	X1,U1
	PUSHJ	PDP,TYO		;PRINT THE CHAR.
	CAIE	U1,15		;<CR>?
	JRST	COMM2		;NO
COMM3:	MOVEI	X1,12		;YES, SO ...
	PUSHJ	PDP,TYO		;PRINT LINE-FEED
	AOSE	HEADFL
	POPJ	PDP,
COMM1:	PUSHJ	PDP,TERPRI
	MOVEI	U1,HEADER
	PUSHJ	PDP,PRINT
	POPJ	PDP,		;AND RETURN

LFSTRT:	PUSHJ	PDP,MAGIN	;GET NEXT CHAR.
	JRST	BEGIN		;EOF FOUND
	JRST	BEGIN2+2	;U1 HAS FIRST CHAR. FOLLOWING LINE FEED

BEGIN3:	PUSHJ	PDP,TERPRI
	TTYUUO	11,0		;CLEAR TTY BUFFER
	SETOM	LRNJMP		;TO SKIP DATA UPDATE FIRST TIME
BEGIN2:
BEGIN4:	PUSHJ	PDP,NEWLIN	;FIRST CHAR. OF NEW CARD IN U1
	JRST	BEGIN		;EOF
	CAIN	U1,"!"		;"!" IS FIRST CHAR. OF KEAR DATA
	AOSA	KEAR		;KEAR NOT = 0 IFF KEAR DATA BEING PROCESSED
	SKIPA
	JRST	.+10
	CAIN	U1,"#"		;A TRUNK CARD?
	JRST	LTR		;YES
	CAIN	U1,"&"		;TEST FOR BOLAND HEADER
	JRST	LTR
	CAIE	U1,"<"		;COMMENT CARD?
	JRST	.+4		;NO
	SETZM	KEAR		;TURN OFF KEAR LEARNING FLAG
	PUSHJ	PDP,COMM	;YES, SO PRINT COMMENT
	JRST	BEGIN4		;AND GET NEXT CARD
	CAIN	U1,">"		;END OF DATA?
	JRST	LSTOP		;YES
	CAIE	U1,14		;FORM FEED?
	JRST	.+4		;NO
	PUSHJ	PDP,MAGIN	;YES, SO GET NEXT CHARACTER & TRY AGAIN
	HALT			;EOF FOUND
	JRST	BEGIN4+2
	CAIE	U1," "		;COLUMN 1 A BLANK?
	JRST	LMOVE+2		;NO, SO MUST BE A MOVE CARD
	JRST	LBRNCH		;MUST BE VARIATION CARD

LTR:	SETZM	WHOWON		;TREAT GAME AS A DRAW TILL WE KNOW BETTER
	MOVEI	U1,"TK"
	SKIPN	KEAR
	SETZ	U1,
	MOVEM	U1,LPOINT		;A TRUNK CARD HAS BEEN FOUND
LTR1:	AOS	U1,TRNKNO	;ADD 1 TO TRUNK CARD COUNTER
	JUMPE	U1,LCONT	;1ST TIME THRU.  NO DATA TO REPORT YET
	SKIPE	BOLFLG
	TRNN	U1,7
	JRST	.+2
	JRST	TTYUU
	PUSHJ	PDP,NUM3
	MOVEI	U1,[ASCIZ /.	/]
	PUSHJ	PDP,PRINT
	MOVEI	P,3
	PUSHJ	PDP,LTIME		;TIME FOR THIS TRUNK
	SETZM	LTRSAV#
LTR2:	MOVE	A,PHASES(P)
	MOVE	Z,LOW(P)
	ADDM	Z,LABEL+2(A)
	ADDM	Z,TLOW
	MOVE	U2,LOW(P)
	MOVE	Z,EQUAL(P)
	ADDM	Z,LABEL+3(A)
	ADDM	Z,TEQUAL
	ADD	U2,EQUAL(P)
	MOVE	Z,HIGH(P)
	ADDM	Z,LABEL+4(A)
	ADDM	Z,THIGH
	ADD	U2,HIGH(P)
	ADDM	U2,LTRSAV
	MOVE	U1,EQUAL(P)
	ASH	U1,-1
	ADD	U1,LOW(P)
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT3		;%L
	SETZM	LOW(P)
	SETZM	HIGH(P)
	MOVE	U1,EQUAL(P)
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT1		;%E
	SETZM	EQUAL(P)
	SOJGE	P,LTR2
	MOVE	U1,LTRSAV
	ADDM	U1,LABELD+1
	PUSHJ	PDP,RJOUT3
	MOVE	U2,THIGH
	ADD	U2,TEQUAL
	ADD	U2,TLOW
	MOVE	U1,TEQUAL
	ASH	U1,-1
	ADD	U1,TLOW
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT3		;%TL
	MOVE	U1,TEQUAL
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT1		;%TE
	PUSHJ	PDP,TERPRI
	SKIPE	RFLAG
	PUSHJ	PDP,TAB1P	;ON PAGE 2
UPTAB:	SETZM	THIGH
	SETZM	TLOW
	SETZM	TEQUAL
	PUSHJ	PDP,LINEAR
UPTAB2:	MOVE	U1,TRNKNO
	TRNE	U1,3
	JRST	TTYUU
	TRNN	U1,777
	JRST	.+3
	PUSHJ	PDP,DIVIDT
	PUSHJ	PDP,DSAVE
	JRST	TTYUU

TTYUU:	TTYUUO	2,U2
	JRST	LCONT
	PUSH	PDP,[EXP TTYUU]
	CAIE	U2,"R"
	JRST	.+3
	SOS	RFLAG#
	POPJ	PDP,
	CAIE	U2,"F"
	JRST	.+3
	SETOM	LFLAGT#
	POPJ	PDP,
	CAIN	U2,"T"
	JRST	TOTALS
		;EXTRA COMMANDS GO IN HERE
	POP	PDP,
	JRST	COMEND+5
LCONTS:	SKIPE	LCONTF
	JRST	LCONT
LCONTZ:	SETZM	MGIBUF
	SETOM	LCONTF
	SETOM	TRNKNO
	MOVEI	U1,1
	MOVEM	U1,SI
	PUSHJ	PDP,DSKINI
	JRST	BEGIN3		;EXTRA INSTRUCTION NEEDED
	JRST	BEGIN3

LLSTOP:	AOS	U1,TRNKNO
	PUSHJ	PDP,NUMOUT
	MOVEI	U1,[ASCIZ / IS THE NEXT TRUNK TO READ/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /TYPE SAVE TO SAVE/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	BEGIN
LSTOP:	PUSHJ	PDP,MAGIN	;GET NEXT CHAR. TO PRINT
	JRST	.+4		;NO MORE CHARACTERS, SO UPDATE EVAL TABLES
	MOVE	X1,U1		;PUT CHAR. IN X1 FOR TYO
	PUSHJ	PDP,TYO		;PRINT CHAR.
	JRST	LSTOP		;DO IT AGAIN
	SETZM	COUNT
	JRST	UPTAB

LCONT:	SKIPE	BOLFLG
	JRST	BOLAND
	SKIPE	TRUNKF
	PUSHJ	PDP,COMM
	MOVSI	A,377360	;LEARN SOME MORE FROM STARTING BOARD
	MOVEM	A,TA		;GET INITIAL BOARD FOR THIS TRUNK
	MOVEI	P,17377
	MOVEM	P,TP
	SETZB	X2,TK
	SETZM	COLOR
	SETOM	X4VAR		;TO COUNT VARIATION BOARDS
	JRST	BEGIN2		;GO GET MOVES NOW

LMOVE:	PUSHJ	PDP,MAGIN	;INPUT CHARACTERS FOR BKOK MOVE
	JRST	ENDERR		;EOF FOUND, NOT EXPECTED HERE
	CAIN	U1,12		;A LINE FEED?
	JRST	LFSTRT		;YES
	CAIE	U1,15		;IS IT A CR
	CAIN	U1," "		;A SPACE?
	JRST	LMOVE		;YES, SO TRY AGAIN
	SKIPE	LRNJMP		;TEST IF JUMP
	JRST	LMOVE1		;LAST MOVE WAS A JUMP
UPDTSC:	SKIPGE	A,BEST
	JRST	LMOVE1		;DO NOT SCORE THIS MOVE
	MOVE	K,SI		;MOVE INDEX
	MOVE	P,PHASE		;PHASE IN P
	MOVE	X3,S(A)		;EVAL SCORE FOR BOOK MOVE
	CAMN	K,A
	SOJLE	K,LMOVE1
	CAMGE	X3,S(K)		;IS IT THE BEST SCORE?
	AOS	HIGH(P)		;H COUNT (ADD 1 FOR EVERY SCORE > BEST)
	CAMN	X3,S(K)
	AOS	EQUAL(P)		;E COUNT
	CAMLE	X3,S(K)
	AOS	LOW(P)		;L COUNT (ADD 1 FOR EVERY SCORE < OR = BEST)
	PUSHJ	PDP,TAB1E	;ON PAGE 2
	SOJG	K,UPDTSC+3
LMOVE1:	SETZM	NNNONO#
	CAIN	U1,"%"		;A BAD MOVE
	JRST	NONONO
	CAIN	U1,"="		;ONLY FAIR MOVE
	JRST	NOGOOD
	CAIN	U1,"'"		;BEST MOVE
	JRST	BSTMOV
LMOVE2:	SETZM	SI
	MOVE	A,TA		;GET LAST BOARD
	MOVE	P,TP
	MOVE	K,TK
	MOVEM	A,PLA		;STORE BOARD FOR FUTURE PUPPING
	MOVEM	P,PLP
	MOVEM	K,PLK
	SETZB	X3,LXF		;ZERO INDEX & LEGAL BOOK MOVE FLAG
	AOS	X2		;INCREMENT MOVE POINTER
	CAIN	U1,"X"		;IS IT AN "X"
	JRST	XCODE		;YES
	CAIN	U1,"*"		;A STAR?
	JRST	LA1		;YES
	CAIL	U1,60		;IS IT A NUMBER?
	CAILE	U1,71		;IT IS IF 57 < U1 < 72.
	SOJA	X2,BEGIN2	;NOT A NUMBER, PROBABLY A <CR>
	PUSHJ	PDP,NOSTO+2	;A NUMBER, SO DON'T SAVE BOARD
	JRST	LA4

NOGOOD:	SETOM	NNNONO
	JRST	.+3
BSTMOV:	MOVEI	Z,1		;FOR DOUBLE CREDIT LATER
	MOVEM	Z,NNNONO
	PUSHJ	PDP,MAGIN
	HALT
	JRST	LMOVE2
NONONO:	MOVE	U1,COLOR
	ADDI	U1,1
	MOVEM	U1,WHOWON	;1 WHITE WINS, 2 BLACK WINS
	JRST	.-6

KEAR.:	PUSHJ	PDP,NOSTO	;GET NEXT MOVE
	MOVE	U3,LPOINT
	ANDI	U3,37777
	LSH	U3,16		;GET IN POSITION
KEAR.0:	PUSHJ	PDP,MAGIN
	HALT
	MOVE	U2,U1
	PUSHJ	PDP,MAGIN
	HALT
	CAIN	U1,15		;NOT A CR
	JRST	KEAR.2
	CAIE	U1," "
	CAIN	U1,"+"
	JRST	KEAR.2		;SINGLE CHARACTER CASE
	LSH	U2,7
	IOR	U2,U1
	PUSHJ	PDP,MAGIN
	HALT
	JRST	KEAR.3

KEAR.2:	CAIL	U2,60		;TEST FOR LETTER OR NUMBER
	CAILE	U2,71
	JRST	.+3
	ADDI	U2,14000	;ADD LEADING 0
	JRST	.+3
	LSH	U2,7
	ADDI	U2,60		;ADD TRAILING 0
KEAR.3:	IOR	U2,U3
	PUSHJ	PDP,BDSTOR
	CAIE	U1," "		;NOT A SPACE
	CAIN	U1,15		;NOT A CR
	JRST	LA4		;WE ARE THROUGH
	CAIN	U1,"+"
	JRST	KEAR.0	;SAVE AGAIN
	JRST	LA4

LA1:	SKIPE	KEAR		;WHICH DATA IS BEING PROCESSED?
	JRST	KEAR.		;KEAR DATA.
	MOVE	U2,LPOINT	;GET PRESENT BRANCH
	LSH	U2,6
	ADD	U2,X2		;ADD INDEX WITHIN THIS BRANCH
BDSTOR:	AOS	X4,X4VAR	;INDEX TO NEXT SPACE
	MOVEM	U2,ME(X4)	;STORE THE BOARD
	MOVEM	A,MA(X4)
	MOVEM	P,MP(X4)
	SKIPE	COLOR		;RIGHTMOST GUARD BIT IS COLOR
	TRO	K,400
	MOVEM	K,MK(X4)
	TRZ	K,400		;ZERO BIT (IT MIGHT NEED IT)
	MOVE	Z,WHOWON
	HRL	Z,WINLOS	;SAVE DISDANCE TO WIN OR LOSS
	MOVEM	Z,MWL(X4)	;SAVE WHOWON FLAG
	SKIPE	KEAR
	POPJ	PDP,		;KEAR WANTS RETURN
	AOSE	DWFLAG		;IT'S -1 ONLY WHEN COMING FROM XCODE
	PUSHJ	PDP,NOSTO	;GET BOOK MOVE
LA4:	PUSHJ	PDP,PHASEV	;COMPUTE INITIAL PHASE
	MOVE	U1,PHASES(U5)
	MOVEM	U1,PHASAD	;FOR USE IN EVA
	SETZB	X3,LRNJMP#	;ASSUME NORMAL MOVE
	SETZM	STOP		;WIPE SLATE CLEAN
	PUSHJ	PDP,LEGAL	;NOW GET ALL TRUNKS
	JRST	NOMOV		;NO LEGAL MOVES
	JRST	.+2		;DEPEND ON X4NORM FOR SINGLE MOVE DETECT
	AOS	STOP		;BIT 35 USED FOR X3=0 CASE
	PUSHJ	PDP,X4NORM
	MOVE	Z,X4ALL
	TRNN	Z,16
	JRST	LA4JJ		;MAY BE FORKED
LA4A:	SKIPN	U1,WHOWON
	JRST	LA4B	;OK TO GO ON
	SUBI	U1,1
	CAMN	U1,COLOR
	JRST	LA4J		;DO NOT LEARN
LA4B:	SKIPGE	NNNONO
	JRST	LA4J		;DO NOT LEARN
	MOVEI	X1,1
	MOVE	Z,EEB
	MOVEM	Z,EB
	MOVEM	Z,EBA
	MOVE	Z,EEB2
	MOVEM	Z,EB2
	MOVEM	Z,EBA2
	SETZM	TA		;FILLED AFTER BOOK MOVE
	SETZM	X4CNT
	SETZM	X4MOVE
	AOJA	X3,ALS2

LA4JJ:	SETOM	LRNJMP
	ADDI	X3,1
	MOVE	Z,PLRF-1(X3)
	MOVEM	Z,LA4RF#	;SAVE IF NEEDED
	MOVE	Z,PLLF-1(X3)
	MOVEM	Z,LA4LF#
	MOVE	Z,PLLB-1(X3)
	MOVEM	Z,LA4LB#
	MOVE	Z,PLRB-1(X3)
	MOVEM	Z,LA4RB#
	PUSHJ	PDP,PUP
	JRST	NOMOV		;ERROR SHOULD NEVER HAPPEN
	CAME	P,TP
	JRST	.+3
	MOVEM	A,TA
	MOVEM	K,TK
	PUSHJ	PDP,PUP
	JRST	LDEF		;0NLY ONE MOVE
	MOVE	Z,LA4RF
	MOVEM	Z,PLRF-1(X3)
	MOVE	Z,LA4LF
	MOVEM	Z,PLLF-1(X3)
	MOVE	Z,LA4LB
	MOVEM	Z,PLLB-1(X3)
	MOVE	Z,LA4RB
	MOVEM	Z,PLRB-1(X3)
	SETZM	LRNJMP
	SOJA	X3,LA4A

LA4J:	SETOM	LRNJMP
	SETZM	TA
	ADDI	X3,1
	PUSHJ	PDP,PUP
	JRST	LDEF
	CAME	P,TP
	JRST	.-3
	MOVEM	A,TA
	MOVEM	K,TK
	JRST	LDEF

DSKINI:	INIT	4,0
	SIXBIT	/DSK/
	XWD	MGOBUF,MGIBUF
	JRST	DSKER
	SETZM	DATAG+2
	MOVE	U1,[SIXBIT /  2KDH/]
	MOVEM	U1,DATAG+3
	LOOKUP	4,DATAG
	JRST	DSKER
	INBUF	4,11
	AOS	(PDP)
	POPJ	PDP,

DSKER:	MOVEI	U1,[ASCIZ /NO GAMES ON DSK/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	RELEAS	4,
	POPJ	PDP,

DATAG:	SIXBIT	/LEES/
	SIXBIT	//
	Z
	Z

	Z		;GUARD
EB:	BLOCK	20
	Z
EB2:	BLOCK	20
EBA:	Z
EBA2:	Z

ALS1:	MOVE	Z,EB+2
	MOVEM	Z,EEB
	MOVE	Z,EB+1
	MOVEM	Z,EEB+1
	MOVE	Z,EB2+2
	MOVEM	Z,EEB2
	MOVE	Z,EB2+1
	MOVEM	Z,EEB2+1
ALS1B:	MOVEI	X1,1		;FOR NON-BOOK MOVES
	SKIPE	LXF
	HRLZ	X1,X4ALL	;TO LEFT HALF FOR BOOK MOVES
	SKIPLE	NNNONO
	LSH	X1,1		;MULTIPLY BY TWO FOR WIN
	PUSHJ	PDP,LEV1	;EVALUATE AND LEARN ON BACKED UP VALUES
	ADDM	X1,SIGLF(U5)	;UPDATE FINAL TABLE
	AOS	U2,SI
	MOVEM	Z,S(U2)
	SKIPE	LXF
	MOVEM	U2,BEST
ALS1A:	MOVE	Z,EBA
	MOVEM	Z,EB		;OLD VALUE MAY HAVE BEEN BLASTED
	MOVEM	Z,EEB
	MOVE	Z,EBA2
	MOVEM	Z,EB2
	MOVEM	Z,EEB2
	MOVE	Z,EEB-1
	MOVEM	Z,EEB+1
	MOVE	Z,EEB2-1
	MOVEM	Z,EEB2+1
ALS2:	MOVEI	X3,1		;SAFETY MEASURE
	MOVE	Z,LOSE		;RESET FOR EACH NEW BRANCH
	MOVEM	Z,ZZ-1
	MOVEM	Z,ZZ
	SETZM	LXF
	PUSHJ	PDP,PUP
	JRST	LDEF		;LAST BRANCH PROCESSED
	SETZM	EVFLAG#
	AOS	X4CNT		;COUNT OF MOVES
	CAME	P,TP		;IS THIS THE BOOK MOVE
	JRST	ALS3		;NO
	MOVEM	A,TA		;SAVE UPDATED BOARD
	MOVEM	K,TK
	SETOM	LXF		;SET FLAG
	MOVE	U1,X4CNT	;GET MOVE COUNT
	SKIPE	COLOR
	MOVE	U1,X4TAB(U1)
	HRL	U1,WINLOS
	MOVEM	U1,X4MOVE
	SOSGE	WINLOS
	SETZM	WINLOS		;NEG VALUE MEANS TROUBLE
ALS3:	MOVEM	A,PLA(X3)	;PREPARE FOR EXTENSION
	MOVEM	P,PLP(X3)
	MOVEM	K,PLK(X3)
	MOVE	Z,STOP
	AND	Z,STOMP(X3)	;SAVE EARLIER X3 VALUES ONLY
	MOVEM	Z,STOP
	PUSHJ	PDP,LEGAL
	JRST	ALS8
	JRST	ALS3J
	MOVE	Z,STOP
	IOR	Z,STBIT(X3)	;RECORD THIS NON-JUMP MOVE
	MOVEM	Z,STOP
	CAMGE	X3,LDEPTH
	AOJA	X3,ALS5		;GO DEEPER
	AND	Z,STTEST(X3)	;IS OTHER SIDE EVALUATED
	JUMPN	Z,ALS3A		;YES SO DO FULL EVA
	CAMGE	X3,KDEPTH	;MUST WE STOP ANYWAY
	AOJA	X3,ALS5		;NO
	JRST	ALS3A		;DO THE BEST WE CAN

ALS3J:	CAIGE	X3,17		;SPACE LIMIT

	AOJA	X3,ALS4
	SKIPN	LXF		;IS THIS THE BOOK MOVE
	JRST	ALS1A		;NO SO IGNORE THIS PART
	SETOM	BEST		;IGNORE SIGNAL
	JRST	LDEF

ALS3A:	CAIG	X3,1
	JRST	ALS1B		;LEVI IN ALS1B ADEQUATE
	SETZM	LFLAG		;DO NOT UPDATE TABLES NOW
	PUSHJ	PDP,EVA		;BUT DO EVA
ALS3B:	SETOM	LFLAG		;RESET LEARN FLAG
	MOVNS	Z
	CAMG	Z,ZZ-1(X3)
	JRST	ALS6
	MOVEM	Z,ZZ-1(X3)	;BACK SCORE
	MOVE	Z,EEB(X3)
	MOVEM	Z,EB(X3)	;ALSO BACK EV DATA
	MOVE	Z,EEB2(X3)
	MOVEM	Z,EB2(X3)
	MOVE	Z,EEB-1(X3)
	MOVEM	Z,EB-1(X3)
	MOVE	Z,EEB2-1(X3)
	MOVEM	Z,EB2-1(X3)
	JRST	ALS6		;GET NEXT BOARD AT THIS LEVEL

ALS4:	MOVE	Z,EEB-3(X3)	;ADVANCE SINCE NOT COMPUTED FOR JUMP
	MOVEM	Z,EEB-1(X3)
	MOVE	Z,EEB2-3(X3)
	MOVEM	Z,EEB2-1(X3)
ALS5:	MOVE	Z,ZZ-3(X3)
	MOVEM	Z,ZZ-1(X3)
ALS6:	PUSHJ	PDP,PUP		;GET NEXT BOARD
	JRST	ALS7
	JRST	ALS3

ALS7:	CAIG	X3,2		;BACKING FROM WHERE
	SOJA	X3,ALS1		;TIME TO UPDATE TABLES
	MOVN	Z,ZZ-1(X3)	;NORMAL BACK UP
	CAMG	Z,ZZ-2(X3)
	SOJA	X3,ALS6		;GET NEXT BOARD
	MOVEM	Z,ZZ-2(X3)
	MOVE	Z,EB(X3)
	MOVEM	Z,EB-2(X3)
	MOVE	Z,EB2(X3)
	MOVEM	Z,EB2-2(X3)
	SOJA	X3,ALS6

ALS8:	MOVE	Z,LOSE
	JRST	ALS3B

LDEF:	MOVE	Z,EBA		;NEXT MOVE PROTECTION
	MOVEM	Z,EEB-1
	MOVE	Z,EBA2
	MOVEM	Z,EEB2-1
	MOVEI	X3,1
	XORM	X3,COLOR	;CHANGE COLOR
	PUSHJ	PDP,MAGIN	;GET NEXT CHAR.
	JRST	ENDERR		;EOF NOT EXPECETED HERE
	CAIN	U1,"/"		;A "/"?
	SOJA	X2,.-3		;YES, SO DON'T COUNT THIS LAST MOVE
	SKIPN	TA		;TA NOT = 0 IF BOOK MOVE WAS FOUND
	JRST	FORGIV-1	;TA NOT ZERO IF BOOK MOVE FOUND
	SKIPN	LRNJMP		;SINGLE JUMPS NOT STORED
	SKIPN	USEBOK		;ARE WE SAVING ROTE
	JRST	LMOVE+2		;NO
	MOVEM	U1,U1S#
	SKIPN	WINLOS
	JRST	LDEFA		;NO WINLOS GIVEN
	MOVE	U1,WHOWON
	JUMPE	U1,LDEFA	;NO WHOWON DATA
	ADD	U1,COLOR	;NOTE COLOR ALREADY UPDATED
	ADD	U1,WINLOS	;ALSO ALREADY CHANGED
	TRNN	U1,1
	AOS	U1,WINLOS	;CORECT VALUE TO AGREE
	HRLM	U1,X4MOVE	;FIX X4MOVE
	TRNE	U1,1
	JRST	.+3
LDEFA:	SKIPL	NNNONO		;IS THIS LESS THAN BEST
	PUSHJ	PDP,SAVMOV	;NOW SAVE BOARD
	MOVE	U1,U1S
	JRST	LMOVE+2

	MOVEI	U1,[ASCIZ /ILLEGAL BOOK MOVE /]
FORGIV:	MOVEM	U1,ERRMES#
	PUSHJ	PDP,MAGIN	;SEE IF WE CAN FORGIVE THIS BOOK MOVE ERROR
	JRST	ENDERR
	CAIE	U1,15		;CR?
	JRST	.+10
	PUSHJ	PDP,NEWLIN	;YES, SO GET NEW LINE
	JRST	ENDERR
	CAIN	U1," "
	JRST	LBRNCH
	CAIE	U1,"&"
	CAIN	U1,"#"
	JRST	LTR
	CAIE	U1,"*"
	JRST	FORGIV+1
LOC:	MOVE	U1,ERRMES
	PUSHJ	PDP,PRINT
	MOVEM	X2,SAVX2
	MOVE	U1,LPOINT	;PRINT CURRENT VARIATION POINTER
	SETZ	X2,
	JUMPE	U1,.+3
	LSHC	U1,-7
	JUMPN	U1,.-1
	MOVEM	X2,ASCPNT#
	MOVEI	U1,ASCPNT
	PUSHJ	PDP,PRINT
	MOVEI	U1,[ASCIZ / MOVE /]
	PUSHJ	PDP,PRINT
	MOVE	U1,SAVX2	;PRINT NUMBER OF MOVES WITHIN THIS VARIATION
	PUSHJ	PDP,NUMOUT
	PUSHJ	PDP,TERPRI
LOC1:	PUSHJ	PDP,NEWLIN	;FIND TRUNK CARD
	JRST	ENDERR		;EOF NOT EXPECTED HERE
	CAIN	U1,"#"		;TRUNK CARD?
	JRST	LTR		;YES, SO GO TO LTR
	CAIN	U1,"&"		;A BOLAND HEADER CARD
	JRST	LTR		;YES
	JRST	.-6		;NO, SO GET NEXT CARD
XCODE:	PUSHJ	PDP,MAGIN	;SKIP OVER BLANK
	JRST	ENDERR		;EOF NOT EXPECTED HERE
	CAIN	U1,"/"		;A "/"?
	SOJA	X2,XCODE	;YES, SO DON'T COUNT "X" & GET NEXT CHAR.
XCODE0:	PUSHJ	PDP,MAGIN	;GET NEXT CHARACTER
	JRST	ENDERR		;EOF FOUND, BUT NOT EXPECTED
	CAIN	U1," "		;A SPACE?
	JRST	XCODE0		;YES, SO TRY AGAIN
	CAIE	U1,15		;A <CR>?
	JRST	.+3
	PUSHJ	PDP,NEWLIN	;YES, SO GET NEW LINE
	JRST	ENDERR
	CAIGE	U1,72		;IS IT A DIGIT?
	CAIGE	U1,60		;IT IS IF 57 < U1 < 71.
	CAIN	U1,"*"		;NOT A NUMBER, SO IS IT A "*"?
	AOSA	X2		;IT IS A NUMBER OR A STAR
	JRST	BEGIN2+2	;NO MOVES FOLLOW "X"
	CAIE	U1,"*"		;IS IT A STAR?
	JRST	.+4		;NO
	SETOM	DWFLAG		;YES, SO SET FLAG
	PUSHJ	PDP,NOSTO
	SKIPA
	PUSHJ	PDP,NOSTO+2	;GET BOOK MOVE   
LA2:	PUSHJ	PDP,LEGAL	;START LOOKING FOR MOVES
	JRST	NOMOVE		;NO LEGAL MOVES, SO GO TO ERROR ROUTINE
	AOSA	X3
	ADDI	X3,1
	CAIN	X3,1		;FIRST TIME THRU?
	JRST	LA3		;YES, SO WE KNOW THIS IS NOT THE BOOK MOVE
	SKIPL	U1,U4S		;GET MOVE DELTA
	JRST	BM		;A BACKWARD MOVE
	TRNE	U1,3		;RIGHT OR LEFT?
	SKIPA	U1,PLLF-1(X3)	;LF MOVE
	MOVE	U1,PLRF-1(X3)	;RF MOVE
	JRST	.+4
BM:	TRNE	U1,3		;RIGHT OR LEFT?
	SKIPA	U1,PLRB-1(X3)	;RB MOVE
	MOVE	U1,PLLB-1(X3)	;LB MOVE
	TDNN	U1,U2SS		;AND HERE IS BOOK MOVE
	JRST	LA3		;THEY DO NOT INTERSECT
	MOVE	A,PLA-1(X3)
	MOVEM	A,TA		;STORE BOARD AFTER X HAS BEEN COMPLETED
	MOVEM	A,PLA
	MOVE	P,PLP-1(X3)
	MOVEM	P,TP
	MOVEM	P,PLP
	MOVE	K,PLK-1(X3)
	MOVEM	K,TK
	MOVEM	K,PLK
	MOVEI	U2,1		;IN CASE COLOR NEEDS CHANGING
	TRNN	X3,1		;"X" CHANGE THE ACTIVE SIDE?
	XORM	U2,COLOR	;YES
	SETZM	X3
	MOVE	U2,BKMOVE
	XOR	U2,A
	MOVEM	U2,TP		;TP NOW SET UP
	SKIPGE	DWFLAG
	JRST	LA1		;"X" FOLLOWED BY A "*"
	JRST	LA4
LA3:	PUSHJ	PDP,PUP
	SOJA	X3,.-1		;BACK UP IF THIS LEVEL IS EXHAUSTED
	MOVEM	A,PLA(X3)	;FOR FUTURE PUP'S
	MOVEM	P,PLP(X3)
	MOVEM	K,PLK(X3)
	CAIL	X3,12		;SHOULD WE GO DEEPER?
	JRST	LA3		;NO, BACK-UP
	JRST	LA2		;YES

BBRNCH:	PUSHJ	PDP,MAGIN
	HALT
	CAIE	U1,11		;LOOK FOR A TAB
	JRST	.-3
	JRST	KBRNC2		;KEAR ROUTINE OK NOW

KBRNCH:	MOVEI	U2,↑D21
	PUSHJ	PDP,MAGIN	;GET 23RD CHAR.
	HALT
	SOJG	U2,.-2
KBRNC2:	PUSHJ	PDP,MAGIN	;THIS IS 23RD CHAR.
	HALT
	MOVE	U3,U1
	PUSHJ	PDP,MAGIN	;GET NEXT CHAR.
	HALT
	CAIN	U1,15
	JRST	LDO+4
	CAIE	U1,11
	CAIN	U1," "
	JRST	KBRNC3
	LSH	U3,7		;MOVE FIRST CHAR. OVER
	IOR	U3,U1		;AND PUT IN SECOND CHAR.
	JRST	KBRNC4

KBRNC3:	CAIL	U3,60
	CAILE	U3,71
	JRST	.+3
	ADDI	U3,14000
	JRST	.+3
	LSH	U3,7
	ADDI	U3,60
KBRNC4:	MOVEM	U3,LPOINT	;STORE VAR. POINTER
	PUSHJ	PDP,MAGIN	;GET NEXT NON-SPACE CHAR.
	HALT
	CAIN	U1,15		;WAS CHARACTER A CR
	JRST	LDO+4		;AN ERROR
	CAIE	U1,11		;IS IT A TAB
	CAIN	U1," "		;IS IT A SPACE
	JRST	.-6		;LAST CHAR. WAS A SPACE OR TAB
	MOVE	A,U1
	PUSHJ	PDP,MAGIN
	HALT
	CAIE	U1,15
	JRST	KBRNC5
	CAIL	A,60
	CAILE	U1,71
	JRST	.+3
	ADDI	A,14000
	JRST	.+3
	LSH	A,7
	ADDI	A,60
	JRST	KBRNC6

KBRNC5:	LSH	A,7
	IOR	A,U1
KBRNC6:	LSH	A,16
	IOR	U3,A
	JRST	LDO+4		;NOW GO FIND MATCH

LBRNCH:	SKIPE	PRNVAR
	JRST	LOC1
	SETZB	X2,U3		;ZERO MOVE POINTER
	SKIPE	BOLFLG
	JRST	BBRNCH		;BOLAND FORMAT USED
	SKIPE	KEAR		;KEAR DATA?
	JRST	KBRNCH		;YES
	MOVEI	U2,↑D35		;GET TO CHAR. #37
	PUSHJ	PDP,MAGIN	;GET CHAR.
	JRST	ENDERR
	SOJG	U2,.-2		;JUMP IF NOT CHAR. #36
LUL:	SETZM	U2
LUPE:	PUSHJ	PDP,MAGIN	;GET CHAR. FROM INPUT BUFFER
	JRST	ENDERR		;EOF NOT EXPECTED HERE
	CAIGE	U1,72		;IS CHAR. A DIGIT?
	CAIGE	U1,60		;IT IS IF 57 < U1 < 72.
	JRST	LDO		;NO
	IMULI	U2,12
	ADD	U2,U1
	SUBI	U2,60
	JRST	LUPE
LDO:	LSH	U3,6		;SAVE LAST NUMBER
	ADD	U3,U2
	CAIE	U1," "		;ARE WE THROUGH?
	JRST	LUL		;NO
	MOVEM	U3,LPOINT	;STORE THIS BRANCH NUMBER
	MOVE	U2,X4VAR	;X4VAR IS NUMBER OF SAVED BOARDS
	CAMN	U3,ME(U2)	;LOOK FOR PROPER TABLE ENTRY
	JRST	LHERE		;FOUND IT
	SOJGE	U2,.-2		;KEEP LOOKING
	TDZA	U3,.+1		;NO MATCH, SO VAR. POINTER ERROR?
	777777740000
	MOVE	U2,X4VAR		;TRY AGAIN, THIS TIME WITH VAR. MASKED OUT
	MOVE	U1,ME(U2)
	TRZ	U1,740000
	CAIN	U3,(U1)		;ARE MOVE POINTERS EQUAL?
	JRST	LHERE		;YES, SO THIS IS THE ONE WE WANT, WE HOPE
	SOJGE	U2,.-4
	MOVEI	U1,[ASCIZ /BAD TRUNK  /]
	JRST	FORGIV
LHERE:	MOVE	A,MA(U2)	;GET THE BOARD
	MOVEM	A,TA		;PUT IT IN PROPER PLACE
	MOVE	P,MP(U2)
	MOVEM	P,TP
	MOVE	K,MK(U2)
	SETZM	COLOR
	TRZE	K,400		;BIT 27 OF K HAS COLOR
	AOS	COLOR
	MOVEM	K,TK
	MOVE	U1,MWL(U2)
	HRRZM	U1,WHOWON
	HLRZM	U1,WINLOS
	JRST	BEGIN2		;NOW START LEARNING


NOMOV:	MOVEI	U1,[ASCIZ /"LMOVE" ERROR: NO LEGAL MOVES /]
	JRST	FORGIV

NOMOVE:	MOVEI	U1,[ASCIZ /"X" ERROR: NO LEGAL MOVES /]
	JRST	FORGIV

ENDERR:	MOVEI	U1,[ASCIZ /EOF FOUND, BUT NOT EXPECTED /]
	JRST	FORGIV

LERR:	MOVE	U2,U1
	MOVEI	U1,[ASCIZ /LEARNING OVERFLOW/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	MOVE	U1,U2
	JRST	X4VAR
NOSTO:	PUSHJ	PDP,MAGIN	;GET FIRST NUMBER
	JRST	ENDERR		;EOF IS NOT AN ACCEPTABLE NUMBER
	MOVE	U2,U1
	IMULI	U2,12
	PUSHJ	PDP,MAGIN	;GET SECOND NUMBER
	JRST	ENDERR
	ADD	U1,U2
	SUBI	U1,1020		;NORMALIZE FOR ASCII CODE
	PUSHJ	PDP,OUTIN
	MOVE	U4,U1
	MOVNS	U1
	MOVSI	U3,400000
	LSH	U3,(U1)		;CREATE PROPER BIT POSITION
	PUSHJ	PDP,MAGIN	;SAME ROUTINE AS ABOVE
	JRST	ENDERR
	MOVE	U2,U1
	IMULI	U2,12
	PUSHJ	PDP,MAGIN
	JRST	ENDERR
	ADD	U1,U2
	SUBI	U1,1020
	PUSHJ	PDP,OUTIN
	SUB	U4,U1		;U4 IS MOVE DELTA
	MOVM	U5,U4
	MOVNS	U1
	MOVSI	U2,400000
	LSH	U2,(U1)		;U3-U2 IS MOVE
	MOVEM	U3,U2SS		;SOURCE BIT
	MOVEM	U4,U4S		;MOVE DELTA
	IOR	U2,U3
	MOVEM	U2,BKMOVE	;SAVE FOR ROTE
	XOR	U2,A
	MOVEM	U2,TP		;BOOK MOVE TO VERIFY
	POPJ	PDP,

STOP:	Z		;STOP LOOK AHEAD WORD

STOMP:	0		;CLEAN UP STOP
	1		;INDEXED BY X3
	3
	7
	17
	37
	77
	177

STTEST:	0		;TO TEST OTHER SIDE EVAL
	1		;INDEXED BY X3
	2
	5
	12
	25
	52
	125

STBIT:	1		;NORMAL MOVE INDICATORS FOR STOP WORD
	2		;INDEXED BY X3
	4
	10
	20
	40
	100
	200

;MACRO USED INL25B
DEFINE	TAB	(T)	<;TABLE COEF. MACRO
	SETZ	X1,
	MOVE	Z,T(X1)
	PUSHJ	PDP,TRJOUT
	ADDI	X1,1
	CAIGE	X1,5
	JRST	.-4>

LINEAR:	MOVE	A,[XWD -1,LRNPDL]
	SKIPN	LFLAG1
	JRST	L1
	SKIPN	RFLAG
	JRST	.+4
	SETZM	RFLAG
	SETOM	LFLAG5
	SETOM	LFLAG6
	SKIPN	LFLAG5
	JRST	L1
	SETZ	X4,
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /LINEAR TERM COEFFICIENTS/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
L1:	POP	A,K		;GET TABLE START
	JUMPE	K,L21A		;LAST AT THIS LEVEL
	POP	A,Q		;GET RESULT START
	MOVEI	P,3		;PHASE COUNTER
	SKIPN	LFLAG5
	JRST	L2
	REPEAT	4,<
	REPEAT	3,<	XCT	TLIST(X4)
	ADDI	X4,1
	PUSHJ	PDP,PRINT>
	PUSHJ	PDP,TERPRI
	ADDI	X4,17>
	SUBI	X4,105
L2:	MOVEI	U3,26		;ENTRIES PER TABLE
	MOVNM	U3,U3S#
	HRRM	K,L5		;FIX UP ADDRESSES
	HRRM	K,L5A
	HRRM	K,AC
	HRRM	K,AC1
	HRRM	K,L10
	HRRM	K,L10A
	HRRM	Q,L12
	HRRM	Q,C3P
	HRRM	Q,C3N
	HRRM	Q,AC2
	HRRM	Q,C6
	HRRM	Q,C5
	MOVEI	X1,12
	SETZM	TRMA(X1)	;CLEAR TABLES
	SOJGE	X1,.-1
	MOVEI	X1,2
L3:	MOVEI	X2,2
L4:	MOVEI	X3,4
L5:	MOVE	Z,(U3)
	TDNN	Z,[200000200000]
	JRST	.+4
	LSH	Z,-1		;DIVIDE TO PREVENT OVERFLOW
	AND	Z,[177777177777]
L5A:	MOVEM	Z,(U3)
	ASH	Z,-2		;TO HELP OVERFLOW PROBLEM
	AND	Z,DIVMSK
	ADDM	Z,TRMA(X1)
	ADDM	Z,TRMB(X2)
	ADDM	Z,TRMC(X3)
	SUBI	U3,1
	SOJGE	X3,L5
	SOJGE	X2,L4
	SOJGE	X1,L3
	SKIPN	LFLAG1
	JRST	.+10
	MOVE	Z,TRMA
	ADD	Z,TRMA+2
	ADDB	Z,TRMA+1	;CAN USE TEMPORARILY
	LSH	Z,-22
	ADD	Z,TRMA+1
	ANDI	Z,777777
	MOVEM	Z,TRMAT#
	SETZM	TRMA+1		;REQUIRED BY SYMETRY
	SETZM	TRMB+1
	SETZM	TRMC+2
	MOVS	Z,TRMA
	ADDB	Z,TRMA+2
	MOVSM	Z,TRMA		;THIS ADDS THESE CORRECTLY
	SKIPE	LFLAG1		;DO WE PRINT
	PUSHJ	PDP,LRJOUT
	MOVS	Z,TRMB
	ADDB	Z,TRMB+2
	MOVSM	Z,TRMB
	SKIPE	LFLAG1
	PUSHJ	PDP,LRJOUT
	MOVS	Z,TRMC
	ADDB	Z,TRMC+4
	MOVSM	Z,TRMC
	SKIPE	LFLAG1
	PUSHJ	PDP,LRJOUT
	MOVS	Z,TRMC+1
	ADDB	Z,TRMC+3
	MOVSM	Z,TRMC+1
	SKIPE	LFLAG1
	PUSHJ	PDP,LRJOUT
	MOVEI	U3,26
	SETZM	CPOS#		;COUNT OF POSITIVE ENTRIES
	SETZM	CNEG#		;COUNT OF NEGATIVE ENTRIES
	MOVEI	X1,2
L7:	MOVEI	X2,2
L8:	MOVEI	X3,4
L9:	SETZ	Z,
	SKIPN	LFLAG2
	JRST	L10
	ADD	Z,TRMA(X1)
	ADD	Z,TRMB(X2)
	ADD	Z,TRMC(X3)
	TRNN	Z,400000	;TEST FOR RIGHT OVERFLOW
	TLNE	Z,200000	;TEST FOR LEFT OVERFLOW
	PUSHJ	PDP,LZ		;REPORT TROUBLE
L9A:	ASH	-6		;DIVIDE BY 64
	MOVE	U1,WEIGHT
	AND	Z,LMSKW(U1)		;PURGE UNDERFLOW
L10:	ADD	Z,(U3)
	SKIPN	LFLAG7
	JRST	L10C
	MOVN	U1,U3
L10A:	MOVS	U2,(U1)
L10B:	LSH	U2,-1
	MOVE	U1,WEIGH1
	AND	U2,LMSKW(U1)
	ADD	Z,U2
L10C:	HLRZ	U1,Z
	HRRZ	U2,Z
	JUMPE	Z,L12
	SUB	U1,U2
	LSH	U2,1
	ADD	U2,U1
	ASH	U1,14		;MULTIPLY BY 4096
	MOVEM	X2,X2S
	IDIV	U1,U2
	MOVE	X2,X2S
	SKIPLE	U1
	AOS	CPOS		;COUNT POS ENTRIES
	SKIPGE	U1
	AOS	CNEG		;COUNT NEG ENTRIES
	SKIPE	U1		;DO NOT BOTHER WITH ZERO ENTRIES
	ADD	U1,CORADD
L12:	MOVEM	U1,(U3)
	SUBI	U3,1
	SOJGE	X3,L9
	SOJGE	X2,L8
	SOJGE	X1,L7
	MOVE	X5,CPOS		;ENTRIES
	LSH	X5,-1		;DIVIDE BY 2
	MOVEM	X5,CPOS		;ENTRIES PER BUCKET
	ADDI	X5,1		;TAPER SIZES
	MOVEI	U5,2		;LARGEST QUANTUM
	SETZB	U1,U2		;SAFETY MEASURE
L14:	MOVEI	U3,26		;TO INDEX TABLE
	PUSHJ	PDP,C2P		;FIND NEXT TO FIX
	MOVE	X5,CPOS		;RESET ENTRIES
	SUBI	X5,3		;TAPER,REMEMBER
	SOJGE	U5,L14
	MOVE	X5,CNEG
	LSH	X5,-1
	MOVEM	X5,CNEG
	ADDI	X5,1
	MOVEI	U5,2
	SETZB	U1,U2
L14N:	MOVEI	U3,26
	PUSHJ	PDP,C2N
	MOVE	X5,CNEG
	SUBI	X5,3		;TAPER
	SOJGE	U5,L14N
	SKIPE	LFLAG5
	PUSHJ	PDP,TERPRI
	ADDI	K,SIGSIZ		;FOR NEXT PHASE
	ADDI	Q,SIGSIZ
	SOJGE	P,L2		;COUNT PHASES
	SKIPN	LFLAG5
	JRST	L1
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	JRST	L1		;TO NEXT TABLE

L21A:	SKIPN	LFLAGT
	JRST	L21
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /FIRST-LEVEL TABLE COEF./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
L21:	POP	A,K
	SKIPE	LFLAG6
	SETZM	LFLAG5
	JUMPLE	K,L31		;LAST AT THIS LEVEL
	POP	A,Q
	JUMPLE	Q,L31
	MOVEI	P,3		;T0 COUNT PHASES
L22:	SKIPN	LFLAGT
	JRST	L22A
	MOVEI	X1,16
	SETZM	TABA(X1)
	SOJGE	X1,.-1
	MOVEI	X1,4
	MOVEI	X2,4
	MOVEI	X3,4
L22A:	SETZM	CPOS
	SETZM	CNEG
	HRRM	K,AC
	HRRM	K,ACZ
	HRRM	K,AC1
	HRRM	Q,AC2
	HRRM	Q,C3P
	HRRM	Q,C3N
	HRRM	Q,C6
	HRRM	Q,C5
	MOVEI	U3,76		;COUNT ENTRIES
	MOVNM	U3,U3S
AC:	MOVE	Z,(U3)
	TDNN	Z,[200000200000]
	JRST	.+4
	LSH	Z,-1
	AND	Z,[177777177777]
ACZ:	MOVEM	Z,(U3)
	SKIPN	LFLAGT
	JRST	.+11
	ADDM	Z,TABA(X1)
	ADDM	Z,TABB(X2)
	ADDM	Z,TABC(X3)
	SOJGE	X3,.+5
	SOJGE	X2,.+3
	SUBI	X1,1
	MOVEI	X2,4
	MOVEI	X3,4
	SKIPN	LFLAG8
	JRST	AC3A
	MOVN	U1,U3
AC1:	MOVS	U2,(U1)
AC3:	LSH	U2,-1
	MOVE	U1,WEIGH2
	AND	U2,LMSKW(U1)
	ADD	Z,U2
AC3A:	HLRZ	U1,Z
	HRRZ	U2,Z
	JUMPE	Z,AC2
	SUB	U1,U2
	LSH	U2,1
	ADD	U2,U1
	ASH	U1,14		;PLENTY OF SPREAD
	MOVEM	X2,X2SAC#
	IDIV	U1,U2
	MOVE	X2,X2SAC
	SKIPLE	U1
	AOS	CPOS
	SKIPGE	U1
	AOS	CNEG
	SKIPE	U1
	ADD	U1,CORADD
AC2:	MOVEM	U1,(U3)
	SUBI	U3,1
	CAML	U3,U3S
	JRST	AC
	MOVE	X5,CPOS
	IDIVI	X5,7
	ADDI	X5,3		;MAKE OUTSIDE BUCKETS LARGER
	MOVEM	X5,CPOS
	ADDI	X5,1
	MOVEI	U5,7
	SETZB	U1,U2		;SAFETY MEASURE
L25B:	MOVEI	U3,76
	PUSHJ	PDP,C2P		;FIND LARGEST
	SOS	CPOS		;TO TAPER SIZES
	MOVE	X5,CPOS		;RESET ENTRIES
	SOJGE	U5,L25B
	MOVE	X5,CNEG
	IDIVI	X5,7
	ADDI	X5,3		;OUTSIDE BUCKETS LARGER
	MOVEM	X5,CNEG
	ADDI	X5,1
	MOVEI	U5,7
	SETZB	U1,U2
L25BN:	MOVEI	U3,76
	PUSHJ	PDP,C2N
	SOS	CNEG		;TO TAPER SIZES
	MOVE	X5,CNEG
	SOJGE	U5,L25BN
	SKIPN	LFLAGT
	JRST	L25C
	MOVEM	X1,X1SL25#
	TAB	TABA
	MOVEI	U1,[ASCIZ /   /]
	PUSHJ	PDP,PRINT
	TAB	TABB
	MOVEI	U1,[ASCIZ /   /]
	PUSHJ	PDP,PRINT
	TAB	TABC
	MOVE	X1,X1SL25
	PUSHJ	PDP,TERPRI
L25C:	ADDI	K,SIGSIZ
	ADDI	Q,SIGSIZ
	SOJGE	P,L22		;TO NEXT PHASE
	SKIPE	LFLAGT
	PUSHJ	PDP,TERPRI
	JRST	L21		;TO NEXT TABLE

TRJOUT:	HLRZ	U1,Z
	HRRZ	U2,Z
	SUB	U1,U2
	LSH	U2,1
	ADD	U2,U1
	MOVEM	X1,X1STJ#
	MOVEM	X2,X2STJ#
	IMULI	U1,310
	IDIV	U1,U2
	TRNE	U1,1
	ADDI	U1,2
	ASH	U1,-1
	PUSHJ	PDP,RJOUT1
	MOVE	X1,X1STJ
	MOVE	X2,X2STJ
	POPJ	PDP,

L31:	MOVEI	K,SIGLF		;START THIRD LEVEL
	MOVEI	Q,SIGTF
	MOVEI	P,3
L32:	HRRM	K,L34
	HRRM	K,L34Z
	HRRM	K,L34A
	HRRM	Q,L35
	HRRM	Q,C3P
	HRRM	Q,C3N
	HRRM	Q,C5
	HRRM	Q,C6
	MOVEI	U3,160
	MOVNM	U3,U3S
	SETZM	CPOS
	SETZM	CNEG
L34:	MOVE	Z,(U3)
	TDNN	Z,[200000200000]
	JRST	.+4
	LSH	Z,-1
	AND	Z,[177777177777]
L34Z:	MOVEM	Z,(U3)
	SKIPN	LFLAG9
	JRST	L34C
	MOVN	U1,U3
L34A:	MOVS	U2,(U1)
L34B:	LSH	U2,-1
	MOVE	U1,WEIGH3
	AND	U2,LMSKW(U1)
	ADD	Z,U2
L34C:	HLRZ	U1,Z
	HLRZ	U1,Z
	JUMPE	Z,L35
	HRRZ	U2,Z
	SUB	U1,U2
	LSH	U2,1
	ADD	U2,U1
	CAIGE	U2,10
	SETZ	U1,
	ASH	U1,14		;MULTIPLY BY 4096
	IDIV	U1,U2
	SKIPLE	U1
	AOS	CPOS
	SKIPGE	U1
	AOS	CNEG
	SKIPE	U1
	ADD	U1,CORADD
L35:	MOVEM	U1,(U3)
	SUBI	U3,1		;TO NEXT PHASE
	CAML	U3,U3S
	JRST	L34
	SETZ	X5,
	MOVE	U5,CPOS
	SETZB	U1,U2
L35B:	MOVEI	U3,160
	PUSHJ	PDP,C2P
	SETZ	X5,
	SOJGE	U5,L35B
	SETZ	X5,
	MOVE	U5,CNEG
L35BN:	MOVEI	U3,160
	PUSHJ	PDP,C2N
	SETZ	X5,
	SOJGE	U5,L35BN
	ADDI	K,SIGSIZ
	ADDI	Q,SIGSIZ
	SOJGE	P,L32
	SETZM	LFLAGT		;TERMINATE F COMMAND
	POPJ	PDP,

C2P:	MOVEI	Z,10001		;A LARGE NO.
	MOVNM	Z,LARGE#
C3P:	MOVE	Z,(U3)
	CAMGE	Z,CORCOM
	JRST	C4P		;ALREADY PROCESSED
	SUB	Z,CORADD
	JUMPLE	Z,C4P
	CAMG	Z,LARGE
	JRST	.+3
	MOVEM	Z,LARGE		;SAVE IF LARGER
	MOVE	U1,U3		;SAVE INDEX
C4P:	SUBI	U3,1
	CAML	U3,U3S
	JRST	C3P
	SKIPL	LARGE
C5:	MOVEM	U5,(U1)		;QUANTIZE
	SOSGE	X5
	POPJ	PDP,
	SOS	(PDP)
	SOS	(PDP)
	POPJ	PDP,

C2N:	MOVEI	Z,10001		;A LARGE NO.
	MOVEM	Z,SMALL#
C3N:	MOVE	Z,(U3)
	CAMGE	Z,CORCOM
	JRST	C4N		;ALREADY PROCESSED
	SUB	Z,CORADD
	JUMPGE	Z,C4N
	CAML	Z,SMALL
	JRST	.+3
	MOVEM	Z,SMALL		;SAVE IF SMALLER 
	MOVE	U2,U3		;SAVE INDEX
C4N:	SUBI	U3,1
	CAML	U3,U3S
	JRST	C3N
	SKIPG	SMALL
C6:	MOVNM	U5,(U2)		;QUANTIZE
	SOSGE	X5
	POPJ	PDP,
	SOS	(PDP)
	SOS	(PDP)
	POPJ	PDP,

CORCOM:	300000000000
CORADD:	377000000000

WEIGH1:	1
WEIGH2:	1
WEIGH3:	1
WEIGHT:	6
LMSKW:	777777777777
	377777377777
	177777177777
	077777077777
	037777037777
	017777017000
	007777007777
	003777003777
	001777001777
	000777000777
	000377000377
	000177000177
	000077000077
	000037000037
	000017000017
	000007000007
	000003000003
	000001000001
	000000000000
	Z
	Z
	SIGT22
	SIGL22
	SIGT21
	SIGL21
	Z
	SIGT16
	SIGL16
	SIGT15
	SIGL15
	SIGT14
	SIGL14
	SIGT13
	SIGL13
	SIGT12
	SIGL12
	SIGT11
LRNPDL:	SIGL11

LRJOUT:	HLRZ	U1,Z
	HRRZ	U2,Z
	SUB	U1,U2
	LSH	U2,1
	ADD	U2,U1
	MOVEM	X1,X1S
	MOVEM	X2,X2S
	IMULI	U1,310		;MULTIPLY BY 200
	SKIPN	LFLAG5
	JRST	.+6
	MOVEM	U1,U1S#
	IMULI	U1,5
	IDIV	U1,TRMAT
	PUSHJ	PDP,RJOUT3
	MOVE	U1,U1S
	IDIV	U1,U2		;WARNING DISTROYS X2
	TRNE	U1,1
	ADDI	U1,2
	ASH	U1,-1		;DIVIDE BY 2
	PUSHJ	PDP,RJOUT2
	SKIPN	LFLAG5
	JRST	.+3
	MOVE	U1,U2
	PUSHJ	PDP,RJOUT
	MOVE	X1,X1S
	MOVE	X2,X2S
	POPJ	PDP,

LZ:	MOVEM	X2,X2S
	MOVEM	X1,X1S
	MOVEI	U1,[ASCIZ /TRM OVERFLOW /]
	PUSHJ	PDP,PRINT
	MOVE	U1,X1S
	PUSHJ	PDP,NUMOUT
	MOVE	U1,X2S
	PUSHJ	PDP,NUMOUT
	MOVE	U1,X3
	PUSHJ	PDP,NUMOUT
	PUSHJ	PDP,TERPRI
	MOVE	X1,X1S
	MOVE	X2,X2S
	POPJ	PDP,

RJOUT1:	SETZ	X2,
	SKIPGE	U1
	SOS	X2
	MOVM	Z,U1
	JRST	RJ2

RJOUT2:	SETZ	X2,
	SKIPGE	U1
	SOS	X2		;SPACE FOR - SIGN
	MOVM	Z,U1
RJ2A:	SKIPE	LFLAG5
	JRST	RJ2
	POPJ	PDP,

RJOUT3:	SETZ	X2,
	SKIPGE	U1
	SOS	X2
	MOVM	Z,U1
	JRST	RJ4

LDEPTH:	0		;LEARNING DEPTH CONTROL
KDEPTH:	3		;SECOND DEPTH CONTROL NUMBER
LFLAG1:	1		;NON-ZERO TO SAVE LINEARIZE
LFLAGZ:	1		;LINEARIZE
LFLAG2:	1		;TO LINEARIZE SIG
LFLAG3:	Z		;TO LINEARIZE LRN
LFLAG5:	Z
LFLAG6:	Z
LFLAG7:	1
LFLAG8:	1
LFLAG9:	1
TRUNKF:	0
SMOOTH:	Z
SMFAZE:	1
PRNVAR:	0
DORM:	Z		;NOT 0 TO SAVE PLOT DATA
DSKTAP:	Z		;0 FOR DSK AT START
TRMA:	BLOCK	3
TRMB:	BLOCK	3
TRMC:	BLOCK	5

TABA:	BLOCK	5
TABB:	BLOCK	5
TABC:	BLOCK	5

TOTALS:	MOVEI	U1,[ASCIZ / TOTALS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,LABELD+1
	IDIVI	U1,↑D1000
	PUSHJ	PDP,RJOUT1
	MOVEI	P,SIGSIZ*3
TOTAL2:	MOVE	U2,LABEL+2(P)
	ADDM	U2,TLOW
	ADD	U2,LABEL+4(P)
	ADD	U2,LABEL+3(P)
	MOVE	U1,LABEL+3(P)
	ASH	U1,-1
	ADD	U1,LABEL+2(P)
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT3
	MOVE	U1,LABEL+3(P)
	ADDM	U1,TEQUAL
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT1
	MOVE	U1,LABEL+4(P)
	ADDM	U1,THIGH
	SUBI	P,SIGSIZ
	JUMPGE	P,TOTAL2
	MOVE	U1,LABEL+1
	PUSHJ	PDP,RJOUT3
	MOVE	U2,TEQUAL
	MOVE	U1,U2
	ADD	U2,TLOW
	ADD	U2,THIGH
	ASH	U1,-1
	ADD	U1,TLOW
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT3
	MOVE	U1,TEQUAL
	IMULI	U1,144
	IDIV	U1,U2
	PUSHJ	PDP,RJOUT1
	PUSHJ	PDP,TERPRI
	SETZM	THIGH
	SETZM	TLOW
	SETZM	TEQUAL
	MOVEI	P,SIGSIZ*3
	MOVEI	U1,[ASCIZ /      MOVES /]
	PUSHJ	PDP,PRINT
	MOVE	U1,LABEL+2(P)
	ADD	U1,LABEL+3(P)
	ADD	U1,LABEL+4(P)
	PUSHJ	PDP,RJOUT
	MOVEI	U1,[ASCIZ /   /]
	PUSHJ	PDP,PRINT
	SUBI	P,SIGSIZ
	JUMPGE	P,.-6
	PUSHJ	PDP,TERPRI
	POPJ	PDP,
;SUBROUTINE TO SYMETRICALLY SMOOTH LEARNING DATA
SYM:	MOVE	A,[XWD -1,SYMPDL]
SYM0:	POP	A,K
	JUMPE	K,SYM10
	POP	A,U2
	MOVEI	P,3
SYM1:	HRRM	K,SYM3
	HRRM	K,SYM4
	HRRM	K,SYM5
	HRRM	K,SYM6
	MOVE	U3,U2
SYM2:	MOVN	U1,U3
SYM3:	MOVS	Z,(U1)
SYM4:	ADD	Z,(U3)
	LSH	Z,-1
	AND	Z,LMSKW+1
SYM5:	MOVEM	Z,(U3)
SYM6:	MOVSM	Z,(U1)
	SUBI	U3,1
	JUMPGE	U3,SYM2
	ADDI	K,SIGSIZ
	SOJGE	P,SYM1
	JRST	SYM0
SYM10:	POPJ	PDP,

	Z
	Z
	160
	SIGLF
	76
	SIGL22
	76
	SIGL21
	26
	SIGL16
	26
	SIGL15
	26
	SIGL14
	26
	SIGL13
	26
	SIGL12
	26
SYMPDL:	SIGL11

FACTOR:	SETZB	U2,U3
	MOVEI	U4,LRN11
FACTO2:	MOVEI	U1,SIGSIZ-6	;ALLOW FOR LABEL OF 5
	HRRM	U4,.+2
	HRRM	U4,.+3
	HLRZ	Z,LRN11(U1)
	ADD	U2,Z
	HRRZ	Z,LRN11(U1)
	ADD	U3,Z
	SOJGE	U1,.-4
	ADDI	U4,SIGSIZ
	CAIGE	U4,LRN11+SIGSIZ*4
	JRST	FACTO2
	IMULI	U3,144
	IDIV	U3,U2
	SKIPN	TRUNKF
	JRST	.+6
	MOVEI	U1,[ASCIZ /FACTOR IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,U3
	PUSHJ	PDP,NUMOUT
	PUSHJ	PDP,TERPRI
	MOVE	U4,LRN11
FACTO3:	MOVEI	U1,SIGSIZ-6
	HRRM	U4,.+2
	HRRM	U4,.+4
	HLLZ	U2,LRN11(U1)
	IDIVI	U2,144
	IMUL	U2,U3
	HLLM	U2,LRN11(U1)
	SOJGE	U1,.-4
	ADDI	U4,SIGSIZ
	CAIGE	U4,LRN11+SIGSIZ*4
	JRST	FACTO3
	POPJ	PDP,

DIVIDE:	MOVEI	U4,LRN11
	MOVE	U2,DIVMSK
	MOVEI	U1,SIGSIZ-6
	HRRM	U4,.+2
	HRRM	U4,.+5
	MOVE	Z,LRN11(U1)
	LSH	Z,-1
	AND	Z,U2
	TDNE	Z,[777000777000]	;DO NOTHING IF SMALL
	MOVEM	Z,LRN11(U1)
	SOJGE	U1,.-5
	ADDI	U4,SIGSIZ
	CAIGE	U4,LRN11+SIGSIZ*4
	JRST	.-13
	MOVEI	U1,[ASCIZ /TABLES HALVED/]
	PUSHJ	PDP,PRINT
	JRST	TERPRI
DIVMSK:	177777177777

DIVIDT:	MOVE	U2,[200000400000]
	MOVEI	U4,LRN11
	MOVEI	U1,SIGSIZ-6
	HRRM	U4,.+1
	MOVE	Z,LRN11(U1)
	AND	Z,U2
	JUMPN	Z,.+6
	SOJGE	U1,.-3
	ADDI	U4,SIGSIZ
	CAIGE	U4,LRN11+SIGSIZ*4
	JRST	.-10
	POPJ	PDP,
	MOVEI	U1,[ASCIZ /TIME TO DIVIDE/]
	PUSHJ	PDP,PRINT
	JRST	TERPRI

	;TYPING OF LEARN COMMAND WILL SET LFLAG AND
	;GO TO BEGIN

	;TYPING OF LEARN, ZERO, TABLES WILL ZERO ALL 
	;LEARNING TABLES AND BRANCH TO ABOVE COMMAND
	;INTERPRETATION.

LZERO:	SETZM	LABELD
	MOVE	Z,[XWD	LABELD,LABELD+1]
	BLT	Z,LABELD+SIGSIZ*4-1
	POPJ	PDP,

ZL:	MOVEI	U5,4
	SETZM	LABELD(U5)
	SETZM	LABEL(U5)
	SETZM	LABEL+SIGSIZ(U5)
	SETZM	LABEL+SIGSIZ*2(U5)
	SETZM	LABEL+SIGSIZ*3(U5)
	SOJGE	U5,.-5
	POPJ	PDP,

LC:	PUSHJ	PDP,LPTFIX
	SETCMM	LPFLAG
	MOVEI	U1,[ASCIZ /FILE NAME  # BDS   2 MVS /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	INIT	12,17
	SIXBIT	/DSK/
	Z
	HALT
	SETZM	TTNMVS	;FOR TOTALS
	SETZM	TTNBDS
	MOVEI	U2,INPSIZ-1
	SETZM	INPA(U2)
	SOJGE	U2,.-1
	MOVEI	U5,2
	MOVE	U2,[SIXBIT /MA/]
	MOVEM	U2,DSKBKE#
	MOVE	U2,[ASCIZ /MA/]
	MOVEM	U2,LC7SAE
LC2:	MOVEI	X4,14
LC3:	MOVEI	X5,20		;TO INDEX CRIP
LC3A:	MOVE	U2,DSKBKE
	MOVEM	U2,DSKBKD
	MOVE	U2,LC7SAE
	MOVEM	U2,LC7SAV
LC4:	MOVE	U2,CRIP(X4)
	LSH	U2,14
	IOR	U2,CRIP(X5)
	IOR	U2,DSKBKD
	MOVEM	U2,DSKBKM
	MOVE	U2,[SIXBIT /CHK/]
	MOVEM	U2,DSKBKM+1
	MOVE	U2,[055000000000]
	MOVEM	U2,DSKBKM+2
	MOVE	U2,[SIXBIT /  3ALS/]
	MOVEM	U2,DSKBKM+3
LC5:	LOOKUP	12,DSKBKM
	JRST	LC10		;NO FILE
	INPUT	12,BKMIN
	SETZM	TNOBDS
	SETZM	TNOMVS
	MOVEI	U4,INPSIZ/BLOWUP-2
	CAIGE	U5,2
	MOVEI	U4,INPSIZ/BLOWUP-3
LC6:	SKIPN	U3,INPP(U4)
	JRST	LC6A		;LAST LINE OF THIS FILE
	CAIGE	U5,2
	JRST	.+3
	TDNE	U3,[400400400400]	;ARE THERE TWO MOVES
	AOS	TNOMVS		;YES
	AOS	TNOBDS
LC6A:	SUBI	U4,2
	CAIGE	U5,2
	SUBI	U4,1
	JUMPGE	U4,LC6		;TEST NEXT ENTRY
LC7:	MOVEI	U1,LC7SAV
	PUSHJ	PDP,PRINT
	MOVEI	U1,LASCIZ(X4)
	PUSHJ	PDP,PRINT
	MOVEI	U1,LASCIZ(X5)
	PUSHJ	PDP,PRINT
	MOVEI	X1,11
	PUSHJ	PDP,TYO
	MOVE	U1,TNOBDS
	ADDM	U1,TTNBDS
	PUSHJ	PDP,RJOUT
	MOVEI	X1,11
	PUSHJ	PDP,TYO
	MOVE	U1,TNOMVS
	ADDM	U1,TTNMVS
	PUSHJ	PDP,RJOUT
	PUSHJ	PDP,TERPRI
	SKIPN	INPA+INPSIZ/BLOWUP-2	;MORE MINORS
	JRST	LC10		;NO
	MOVE	U2,DSKBKD
	ADD	U2,[000100000000]
	MOVEM	U2,DSKBKD
	MOVE	U2,LC7SAV
	ADD	U2,[000020000000]
	MOVEM	U2,LC7SAV
	JRST	LC4

LC10:	SOJGE	X5,LC3A
	SOJG	X4,LC3
	CAIGE	U5,2
	JRST	.+7
	PUSHJ	PDP,TERPRI
	MOVE	U2,[SIXBIT /KA/]
	MOVEM	U2,DSKBKE
	MOVE	U2,[ASCIZ /KA/]
	MOVEM	U2,LC7SAE
	SOJG	U5,LC2
LC20:	PUSHJ	PDP,TERPRI
	SETZM	FILEIN
	SETZM	DSKBKM
	SETZM	FILCHG
	MOVEI	U1,[ASCIZ /TOTALS/]
	PUSHJ	PDP,PRINT
	MOVEI	X1,11
	PUSHJ	PDP,TYO
	MOVE	U1,TTNBDS
	PUSHJ	PDP,RJOUT
	MOVEI	X1,11
	PUSHJ	PDP,TYO
	MOVE	U1,TTNMVS
	PUSHJ	PDP,RJOUT
	PUSHJ	PDP,TERPRI
	RELEAS	12,
	JRST	LPTFIX		;POPJ FROM THERE

LC7SAV:	Z		;TO SAVE ASCIZ 
LC7SAE:	Z		;DITTO

LASCIZ:	ASCIZ /00/
	ASCIZ /01/
	ASCIZ /02/
	ASCIZ /03/
	ASCIZ /04/
	ASCIZ /05/
	ASCIZ /06/
	ASCIZ /07/
	ASCIZ /08/
	ASCIZ /09/
	ASCIZ /10/
	ASCIZ /11/
	ASCIZ /12/
	ASCIZ /13/
	ASCIZ /14/
	ASCIZ /15/
	ASCIZ /16/

TTNMVS:	Z	;TOTAL NUMBER OF  2 MOVE BOARDS
TTNBDS:	Z	;TOTAL NUMBER OF BOARDS
TNOBDS:	Z	;BOARDS FOR THIS FILE
TNOMVS:	Z	;NUMBER OF TWO MOVE BOARDS

	SUBTTL	MACROS FOR SIGNATURE TABLES

	DEFINE	MAC1	(S)	<;OUTER MACRO
		SETZ	U1,
		MAC2	\<3*S-2>
		IMULI	U1,5
		MAC2	\<3*S-1>
		IMULI	U1,5
		MAC2	\<3*S>
		ADD	U1,PHASAD
		SKIPE	LFLAG
		ADDM	X1,SIGL2'S(U1)
		ADD	U5,SIGT2'S(U1)>

	DEFINE	MAC2	(SC)	<;CENTRAL MACRO
		MAC3	1
		MOVE	U2,Q
		IMULI	U2,3
		MAC3	1
		ADD	U2,Q
		IMULI	U2,5
		MAC3	2
		ADD	U2,Q
		ADD	U2,PHASAD
		SKIPN	LFLAG
		JRST	.+5
	MOVE	Z,SIGT1'SC(U2)
	MOVE	U3,SI
	MOVEM	Z,SIGZ1'SC(U3)
		ADDM	X1,SIGL1'SC(U2)
		ADD	U1,SIGT1'SC(U2)>

	DEFINE	MAC3	(C)	<;INNER MACRO
		SETZB	Q,P
		LSHC	Q,4
		LSHC	P,4
		SUB	Q,P
		CAILE	Q,C
		MOVEI	Q,C
		CAMGE	Q,NEG+C
		MOVNI	Q,C>

EVA:	MOVEM	X1,CFZ1	;SAVE X1
	PUSHJ	PDP,PCCNT		;COUNT PIECES
	MOVE	U4,CFLAG	;SEE WHAT KIND OF EVALUATION TO DO
	JUMPE	U4,CFA1
LEV1:	MOVE	A,EEB2(X3)
	MOVE	K,EEB2-1(X3)
	SETZ	U5,
	MAC1	1
	IMULI	U5,17
	MOVE	A,EEB(X3)
	MOVE	K,EEB-1(X3)
	MAC1	2
	ADD	U5,PHASAD
	MOVE	Z,SIGTF(U5)	;GET FINAL SCORE
	SKIPE	LFLAG
	POPJ	PDP,	;LEARNING EXIT
CFC:	ADD	Z,U3	;ADD IN PIECE-COUNT TO SCORE
	MOVE	X1,PLY(X2)	;PLY AT WHICH TIP WAS ENTERED
	ADD	X1,X3		;PLUS PLY IN TIP GIVES TRUE PLY
	SUBI	X1,40
	ASH	Z,5
	SKIPL	Z
	MOVNS	X1
	ADD	Z,X1		;ADD PLY TO SCORE
	MOVE	X1,CFZ1	;RESTORE X1 FOR RETURN
	POPJ	PDP,	;RETURN--SCORE IS LEFT IN Z
CFA1:	MOVE	Z,U3	;THIS IS ONLY EXECUTED IF CFLAG=0
	MOVE	X1,PLY(X2)
	ADD	X1,X3
	SUBI	X1,77
	SKIPL	Z
	MOVNS	X1
	ADD	Z,X1
CFA3:	MOVE	X1,CFZ1	;RESTORE X1 FOR RETURN
	POPJ	PDP,	;RETURN--SCORE IS LEFT IN Z


SIGSIZ=1356		;SIZE OF SIG+LABEL IS 750
PHASAD:	Z

PHASES:	0
	SIGSIZ
	SIGSIZ*2
	SIGSIZ*3

NEG:	0		;NEGATION TABLE
	-1
	-2
	-3
	-4
	-5
	-6
	-7
	-10

DSAVE:	INIT	7,17
	SIXBIT	/DSK/
	Z
	JRST	DSKERR
	MOVE	U1,[SIXBIT /ING/]
	MOVEM	U1,DATA+1
	MOVE	U1,[055000000000]
	MOVEM	U1,DATA+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,DATA+3
	ENTER	7,DATA
	JRST	DSKERR
	OUTPUT	7,MTAOUT
	CLOSE	7,
	MOVE	U1,[SIXBIT /SIGT0/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	ENTER	7,SIGDAT
	JRST	DSKERR
	OUTPUT	7,SIGT0
	CLOSE	7,
	MOVE	U1,[SIXBIT /SIGT1/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	ENTER	7,SIGDAT
	JRST	DSKERR
	OUTPUT	7,SIGT1
	CLOSE	7,
	MOVE	U1,[SIXBIT /SIGT2/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	ENTER	7,SIGDAT
	JRST	DSKERR
	OUTPUT	7,SIGT2
	CLOSE	7,
	MOVE	U1,[SIXBIT /SIGT3/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	ENTER	7,SIGDAT
	JRST	DSKERR
	OUTPUT	7,SIGT3
	RELEAS	7,
	MOVEI	U1,[ASCIZ /DSAVED AS LEARN.ING/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

RSAVE:	INIT	7,17
	SIXBIT	/DSK/
	JRST	DSKERR
	ENTER	7,RDATA
	JRST	DSKERR
	OUTPUT	7,MTAOUT
	RELEAS	7,
	MOVEI	U1,[ASCIZ /DSAVED AS LEARN.DAT/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

RFILL:	INIT	7,17
	SIXBIT	/DSK/
	Z
	JRST	DSKERR
	LOOKUP	7,RDATA
	JRST	DSKERR
	INPUT	7,MTAOUT
	RELEAS	7,
	MOVEI	U1,[ASCIZ /FILLED FROM LEARN.DAT/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

DFILL:	INIT	7,17
	SIXBIT	/DSK/
	Z
	JRST	DSKERR
	MOVE	U1,[SIXBIT /ING/]
	MOVEM	U1,DATA+1
	MOVE	U1,[055000000000]
	MOVEM	U1,DATA+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,DATA+3
	LOOKUP	7,DATA
	JRST	DSKERR
DFILL2:	INPUT	7,MTAOUT
	MOVE	U1,[SIXBIT /SIGT0/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	LOOKUP	7,SIGDAT
	JRST	DSKERR
	INPUT	7,SIGT0
	MOVE	U1,[SIXBIT /SIGT1/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	LOOKUP	7,SIGDAT
	JRST	DSKERR
	INPUT	7,SIGT1
	MOVE	U1,[SIXBIT /SIGT2/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	LOOKUP	7,SIGDAT
	JRST	DSKERR
	INPUT	7,SIGT2
	CLOSE	7,
	MOVE	U1,[SIXBIT /SIGT3/]
	MOVEM	U1,SIGDAT
	MOVE	U1,[SIXBIT /DAT/]
	MOVEM	U1,SIGDAT+1
	MOVE	U1,[055000000000]
	MOVEM	U1,SIGDAT+2
	MOVE	U1,[SIXBIT /  3ALS/]
	MOVEM	U1,SIGDAT+3
	LOOKUP	7,SIGDAT
	JRST	DSKERR
	INPUT	7,SIGT3
	RELEAS	7,
	MOVEI	U1,[ASCIZ /DFILLED FROM LEARN.ING/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

DSKERR:	MOVEI	U1,[ASCIZ /TRY AGAIN/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

DATA:	SIXBIT	/LEARN/
	SIXBIT	/ING/
	055000000000
	SIXBIT	/  3ALS/

RDATA:	SIXBIT	/LEARN/
	SIXBIT	/DAT/
	055000000000
	SIXBIT	/  3ALS/

MTAOUT:	IOWD	SIGSIZ*4,LABELD
	Z

SIGDAT:	SIXBIT /SIGT0/
	SIXBIT	/DAT/
	055000000000
	SIXBIT	/  3ALS/

SIGT0:	IOWD	SIGSIZ,LABEL
	Z
SIGT1:	IOWD	SIGSIZ,LABEL+SIGSIZ
	Z
SIGT2:	IOWD	SIGSIZ,LABEL+SIGSIZ*2
	Z
SIGT3:	IOWD	SIGSIZ,LABEL+SIGSIZ*3
	Z

	SUBTTL	DATA FOR EVALUATION 

CFZ1:	Z	;TEMPORARY STORAGE
CFZ2:	Z
CFZ3:	Z
CFZ4:	Z
CFZ5:	Z
CFZ10:	Z	;BACKUP LOCATION FOR PASK
CFZ11:	Z	;BACKUP LOCATION FOR ACTK
CEMPTY:	Z	;TEMPORARY LOCATION FOR EMPTY, ET.AL.

LABEL:	BLOCK	5
EVAL11:	BLOCK	26	;SIGNATURE TABLES
SIGT11:	BLOCK	27	;LABEL IS CENTERED IN TABLE TO ALLOW NEGATIVE SUBSCRIPTS
EVAL12:	BLOCK	26
SIGT12:	BLOCK	27
EVAL13:	BLOCK	26
SIGT13:	BLOCK	27
EVAL14:	BLOCK	26
SIGT14:	BLOCK	27
EVAL15:	BLOCK	26
SIGT15:	BLOCK	27
EVAL16:	BLOCK	26
SIGT16:	BLOCK	27
EVAL21:	BLOCK	76
SIGT21:	BLOCK	77
EVAL22:	BLOCK	76
SIGT22:	BLOCK	77
EVALF:	BLOCK	160
SIGTF:	BLOCK	161
	BLOCK	SIGSIZ*3		;SPACE FOR OTHER PHASES

LABELD:	BLOCK	5		;TO BALANCE LABEL
LRN11:	BLOCK	26	;LEARNING TABLES
SIGL11:	BLOCK	27
LRN12:	BLOCK	26
SIGL12:	BLOCK	27
LRN13:	BLOCK	26
SIGL13:	BLOCK	27
LRN14:	BLOCK	26
SIGL14:	BLOCK	27
LRN15:	BLOCK	26
SIGL15:	BLOCK	27
LRN16:	BLOCK	26
SIGL16:	BLOCK	27
LRN21:	BLOCK	76
SIGL21:	BLOCK	77
LRN22:	BLOCK	76
SIGL22:	BLOCK	77
LRNF:	BLOCK	160
SIGLF:	BLOCK	161
	BLOCK	SIGSIZ*3		;SPACE FOR OTHER PHASES

LABEL1=LABEL+SIGSIZ
LABEL2=LABEL+SIGSIZ*2
LABEL3=LABEL+SIGSIZ*3
LABLD1=LABELD+SIGSIZ
LABLD2=LABELD+SIGSIZ*2
LABLD3=LABELD+SIGSIZ*3

BLOWUP==10		;RELATIVE SIZE OF INPSIZ IN L AND P
INPSIZ==↑D1020*BLOWUP	;INPSIZ=↑D1020 IN CKP
BOKSIZ=↑D512		;2**N FOR CONVENIENCE

SAVMOV:	AOS	X3,BINDEX
	MOVE	A,PLA
	MOVE	P,PLP
	MOVE	K,PLK
	PUSHJ	PDP,FINDFI	;GET FILE DESIGNATION
	HRLZS	U2
	HRR	U2,X3
	MOVEM	U2,BOOKI(X3)
	SKIPE	COLOR		;COLOR HAS ALREADY BEEN REVERSED
	JRST	SAV0
	PUSHJ	PDP,REVERA
	MOVEM	Z,BOOKA(X3)
	PUSHJ	PDP,REVERP
	MOVEM	Z,BOOKP(X3)
	PUSHJ	PDP,REVERK
	MOVEM	Z,BOOKK(X3)
	JRST	.+4
SAV0:	MOVEM	A,BOOKA(X3)
	MOVEM	P,BOOKP(X3)
	MOVEM	K,BOOKK(X3)
	MOVE	Z,X4MOVE
	MOVEM	Z,BOOKM(X3)
	CAIGE	X3,BOKSIZ-1
	POPJ	PDP,
	MOVEM	X2,X2MS#	;SAVE VALUES
	MOVEM	X4,X4MS#
	PUSHJ	PDP,MERGE
	MOVE	X2,X2MS		;RESTORE FORMER VALUES
	MOVE	X4,X4MS
	POPJ	PDP,

MERGE:	MOVMS	PLACE
	SETOM	BINDEX
	MOVEI	Z,1
	MOVEI	X3,BOKSIZ
MER0:	SUB	X3,Z
	SKIPL	PLACE
	JRST	.+3
	CAIG	X3,BOKSIZ
	JRST	MER8
	JUMPLE	X3,MER8
	MOVE	U1,BOOKI(X3)
	CAMG	U1,BOOKI-1(X3)
	JRST	MER6
MER1:	MOVE	X1,X3
	SUB	X1,Z
	MOVEM	X3,STOP1#
	MOVEM	X3,STOP2#
	ADDM	Z,STOP2
	MOVE	U4,X1
	ADD	U4,PLACE
MER2:	CAMG	U1,BOOKI(X1)
	AOSA	X1
	AOSA	X3
	MOVE	U1,BOOKI-1(X1)
	MOVEM	U1,BOOKI(U4)
	MOVE	U1,BOOKI(X3)
	CAML	X1,STOP1
	AOJA	U4,MER4
	CAMGE	X3,STOP2
	AOJA	U4,MER2
MER3:	ADDI	U4,1
	MOVE	U1,BOOKI(X1)
	MOVEM	U1,BOOKI(U4)
	ADDI	X1,1
	CAML	X1,STOP1
	JRST	MER5
	AOJA	U4,MER3+1

MER4:	MOVE	U1,BOOKI(X3)
	MOVEM	U1,BOOKI(U4)
	ADDI	X3,1
	CAMGE	X3,STOP2
	AOJA	U4,MER4
MER5:	MOVE	X3,STOP1
	SUB	X3,Z
	JRST	MER0

MER6:	MOVEI	U2,BOOKI(X3)
	SUB	U2,Z
	HRLS	U2
	ADD	U2,PLACE
	HRRM	U2,MER7
	ADDM	Z,MER7
	ADDM	Z,MER7
	SOS	MER7
MER7:	BLT	U2,
	SUB	X3,Z
	JRST	MER0

MER8:	LSH	Z,1
	CAIL	Z,BOKSIZ
	JRST	INSERT
	MOVEI	X3,BOKSIZ
	SKIPL	PLACE
	ADD	X3,PLACE
	MOVNS	PLACE
	JRST	MER0

PLACE:	BOKSIZ
BINDEX:	-1		;SAVMOV COUNT

INSERT:	MOVEI	X4,BOKSIZ-1
INS2:	JUMPL	X4,INS6	;END OF INSERT
	HLRZ	U1,BOOKI(X4)	;GET FILE DESCRIPTOR
	SKIPL	PLACE		;IS THIS THE RIGHT ONE?
	HLRZ	U1,BOOKI+BOKSIZ(X4);GET FILE DESCRIPTOR
	CAMN	U1,FILEIN	;CORRECT FILE ALREADY IN CORE?
	JRST	INS1A		;YES
	MOVEM	U1,FILEI2	;SAVE NEW VALUE
	SKIPE	FILCHG#		;HAS FILE BEEN CHANGED
	PUSHJ	PDP,DMPFIL	;YES, SO DUMP CURRENT FILE
	PUSHJ	PDP,GETFIL	;AND GET NEW FILE
INS1A:	HRRZ	X3,BOOKI(X4)	;GET INDEX
	SKIPL	PLACE		;BUT GET THE RIGHT ONE!
	HRRZ	X3,BOOKI+BOKSIZ(X4)	;INDICES UNORDERED SINCE LABEL SORT
	SKIPN	U2,BOOKA(X3)
	JRST	INSZZ
	MOVE	U3,BOOKP(X3)
	MOVE	U4,BOOKK(X3)
	PUSHJ	PDP,FINDX1	;FIND LINE LOCATION
	JRST	INS4B		;NOT FOUND
	JUMPN	U4,INSX+1	;ONLY FIRST K MOVE SAVED
INS3A:	MOVE	Z,INPA(X1)
	AND	Z,[400400400400]
	MOVE	X2,BOOKM(X3)
	PUSHJ	PDP,INBITS
	JUMPN	Z,INS3B		;NORMAL CASE
	IORM	X2,INPA(X1)	;INSERT MOVE
	MOVEM	X1,X1S
	MOVEI	U1,[ASCIZ /REPLACING 0-0 BOARD AT X3=/]
	PUSHJ	PDP,PRINT
	MOVE	U1,X3
	PUSHJ	PDP,NUMOUT
	PUSHJ	PDP,TERPRI
	MOVE	X1,X1S
	JUMPE	U4,INSX		;NON KING CASE
	HLRZ	X2,BOOKM(X3)
	LSH	X2,-4
	PUSHJ	PDP,INBITS
	IORM	X2,INPP(X1)
	HLRZ	X2,BOOKM(X3)
	ANDI	X2,17
	PUSHJ	PDP,INBITS
	IORM	X2,INPK(X1)
	JRST	INSX

INS3B:	CAMN	Z,X2
	JRST	INSX+1		;ITS A DUPLICATE
	MOVE	Z,INPP(X1)
	AND	Z,[400400400400]
	JUMPN	Z,INSX+1	;ONLY TWO MOVES SAVED
	IORM	X2,INPP(X1)
	JRST	INSX		;CORRECTION FINISHED

INS4B:	CAIL	X1,INPSIZ
	JRST	INSZ		;WOOPS FILE MUST BE FULL
	MOVEI	U4,INPSIZ-1
	MOVE	Z,BOOKK(X3)
	MOVE	X2,BOOKM(X3)	;TO INSERT MOVE INFO
	PUSHJ	PDP,INBITS
	IORM	X2,BOOKA(X3)
	JUMPE	Z,INS4E
	HLRZ	X2,BOOKM(X3)	;NOW WINLOS INFO
	JUMPE	X2,INS4C		;DRAW CASE
	LSH	X2,-4		;GET LEFT HALF
	PUSHJ	PDP,INBITS
	IORM	X2,BOOKP(X3)
	HLRZ	X2,BOOKM(X3)	;NOW RIGHT HALF
	ANDI	X2,17		;ZERO OUT LEFT 4 BITS
	PUSHJ	PDP,INBITS
	IORM	X2,BOOKK(X3)
INS4C:	SKIPN	INPA(X1)	;IS DESIGNATED LINE EMPTY
	JRST	INS5		;YES
	MOVEI	U4,INPSIZ-3
	SKIPE	INPA(U4)	;IS FILE FULL
	JRST	INSZ		;YES
	SUBI	U4,3
	SKIPN	U3,INPA(U4)
	JRST	.-2
INS4D:	CAMGE	U4,X1
	JRST	INS5
	MOVE	U3,INPA(U4)
	MOVEM	U3,INPA+3(U4)
	MOVE	U3,INPP(U4)
	MOVEM	U3,INPP+3(U4)
	MOVE	U3,INPK(U4)
	MOVEM	U3,INPK+3(U4)
	SUBI	U4,3
	JRST	INS4D

INS4E:	SKIPN	INPA(X1)
	JRST	INS5
	MOVEI	U4,INPSIZ-2
	SKIPE	INPA(U4)
	JRST	INSZ
	SUBI	U4,2
	SKIPN	INPA(U4)
	JRST	.-2

INS4F:	CAMGE	U4,X1
	JRST	INS5
	MOVE	U3,INPA(U4)
	MOVEM	U3,INPA+2(U4)
	MOVE	U3,INPP(U4)
	MOVEM	U3,INPP+2(U4)
	SUBI	U4,2
	JRST	INS4F

INS5:	MOVE	U2,BOOKA(X3)
	MOVEM	U2,INPA(X1)
	MOVE	U2,BOOKP(X3)
	MOVEM	U2,INPP(X1)
	JUMPE	Z,.+3
	MOVE	U2,BOOKK(X3)
	MOVEM	U2,INPK(X1)
INSX:	AOS	FILCHG		;FILE CHANGE COUNT
	SOJGE	X4,INS2
INS6:	SKIPE	FILCHG		;HAS FILE BEEN CHANGED
	PUSHJ	PDP,DMPFIL	;YES SO DUMP
	SETZM	FILEIN		;FORCE NEW FILE IN
	MOVEI	U1,[ASCIZ /BSAVED./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	INSZZ

INSZ:	MOVEI	U1,[ASCIZ /UNABLE TO ADD TO FILE /]
	PUSHJ	PDP,PRINT
	MOVE	U1,FILEIN
	PUSHJ	PDP,OCTOUT
	PUSHJ	PDP,TERPRI
	JRST	INSX+1		;NO CHANGE TO REPORT

INSZZ:		INIT	12,17
	SIXBIT	/DSK/
	Z
	HALT
	MOVE	U2,[SIXBIT /CHK/]
	MOVEM	U2,WHERIN+1
	MOVE	U2,[055000000000]
	MOVEM	U2,WHERIN+2
	MOVE	U2,[SIXBIT /  3ALS/]
	MOVEM	U2,WHERIN+3
	ENTER	12,WHERIN
	HALT
	OUTPUT	12,WHRINS
	RELEAS	12,
	POPJ	PDP,

WHERIN:	SIXBIT /DIRECT/
	SIXBIT	/CHK/
	055000000000
	SIXBIT /  3ALS/

WHERES=1133		;MUST BE SAME AS IN CKB

WHRINS:	IOWD	WHERES,WHERE
	Z

GETFIL:	MOVEI	U2,INPSIZ-1
	SETZM	INPA(U2)
	SOJGE	U2,.-1
	MOVE	U2,BKMIN2
	MOVEM	U2,BKMIN
	MOVE	U1,FILEI2	;U1 MAY HAVE BEEN CHANGED
	MOVEM	U1,FILEIN	;NOW ACKNOWLEDGE NEW FILE
	LDB	U2,[POINT 5,U1,29]
	LDB	U3,[POINT 5,U1,35]
	MOVE	U2,CRIP(U2)
	LSH	U2,14		;MAKE ROOM FOR  REST
	IOR	U2,CRIP(U3)
	TRNN	U1,10000	;TEST K BIT
	IOR	U2,[SIXBIT /MA/]
	TRNE	U1,10000	;TEST AGAIN
	IOR	U2,[SIXBIT /KA/]	;KING BOARDS
	MOVEM	U2,DSKBKD	;SAVE FOR DMPFIL
	SETZM	FILCHG		;START OVER
	INIT	12,17
	SIXBIT	/DSK/
	Z
	HALT
GETFIA:	MOVEM	U2,DSKBKM
	MOVE	U2,[SIXBIT /CHK/]
	MOVEM	U2,DSKBKM+1
	MOVE	U2,[055000000000]
	MOVEM	U2,DSKBKM+2
	MOVE	U2,[SIXBIT /  3ALS/]
	MOVEM	U2,DSKBKM+3
	LOOKUP	12,DSKBKM
	JRST	GETFIR
	INPUT	12,BKMIN
	HRRZ	U2,BKMIN
	ADDI	U2,INPSIZ/BLOWUP
	HRRM	U2,BKMIN
	SKIPE	(U2)		;IS FILE PARTIALLY EMPTY
	CAIL	U2,INPA+INPSIZ-1	;IS LAST FILE IN
	JRST	GETFIR		;YES
	MOVE	U2,DSKBKM
	ADD	U2,[000100000000]
	JRST	GETFIA
GETFIR:	RELEAS	12,
	POPJ	PDP,

ZEROIT:	HRRZ	U1,BKMIN2
	SETZM	1(U1)		;ZERO REST OF TABLE
	CAMGE	U1,INPA+INPSIZ-2
	AOJA	U1,.-2
	POPJ	PDP,

DMPFIL:	INIT	12,17
	SIXBIT	/DSK/
	Z
	HALT
	MOVE	U1,FILEIN	;RESTORE VALUE
	MOVE	U2,BKMIN2
	MOVEM	U2,BKMIN	;START AT FRONT
	MOVE	U2,DSKBKD	;STARTING FILE
	SETZ	X5,		;TO INDEX WHERE
	MOVEI	U5,BLOWUP		;TO COUNT
DMPFI1:	SKIPN	U3,WHERE(X5)
	JRST	DMPFI2-1		;PUT DATA HERE
	CAMN	U1,U3
	JRST	DMPFI2	;FOUND
	ADDI	X5,BLOWUP+1
	CAIGE	X5,WHERES
	JRST	DMPFI1		;TRY AGAIN
	MOVEI	U1,[ASCIZ /WHERE TABLE IS FULL/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	DMPFI3		;TROUBLE TROUBLE

	MOVEM	U1,WHERE(X5)
DMPFI2:	MOVEM	U2,DSKBKM
	MOVE	U2,[SIXBIT /CHK/]
	MOVEM	U2,DSKBKM+1
	MOVE	U2,[055000000000]
	MOVEM	U2,DSKBKM+2
	MOVE	U2,[SIXBIT /  3ALS/]
	MOVEM	U2,DSKBKM+3
	ENTER	12,DSKBKM
	HALT
	OUTPUT	12,BKMIN
	HRRZ	U2,BKMIN
	ADDI	U2,INPSIZ/BLOWUP
	HRRM	U2,BKMIN
	MOVE	Z,-1(U2)
	SKIPE	BOOKK(X3)
	MOVE	Z,-2(U2)
	AND	Z,[377377377377]	;REMOVE MOVE BITS
	MOVEM	Z,WHERE+1(X5)
	ADDI	X5,1
	JUMPE	Z,DMPFI3
	MOVE	U2,DSKBKM
	ADD	U2,[000100000000]
	SOJG	U5,DMPFI2
DMPFI3:	RELEAS	12,
	SETZM	FILCHG
	POPJ	PDP,

DSKBKD:	Z		;TEMPORARY SAVE OF DSKBKM FOR DMPFIL
DSKBKM:	Z
	SIXBIT	/CHK/
	055000000000
	SIXBIT	/  3ALS/
	Z

BKMIN:	IOWD	INPSIZ/BLOWUP,INPA
	Z
BKMIN2:	IOWD	INPSIZ/BLOWUP,INPA
	Z
	Z

INPA:	BLOCK	INPSIZ
INPP=INPA+1
INPK=INPA+2
	Z
BOOKA:	BLOCK	BOKSIZ+20
BOOKP:	BLOCK	BOKSIZ+20
BOOKK:	BLOCK	BOKSIZ+20
BOOKM:	BLOCK	BOKSIZ+20
BOOKI:	BLOCK	BOKSIZ*2+40
FILEIN:	Z		;FILE ACTUALLY IN MEMORY
FILEI2:	Z		;TEMPORARY STORE OF FILEIN

INBITS:	LSHC	X2,-3
	LSH	X2,10
	LSHC	X2,1
	LSH	X2,10
	LSHC	X2,1
	LSH	X2,10
	LSHC	X2,1
	LSH	X2,10
	POPJ	PDP,

BOLAND:	PUSHJ	PDP,MAGIN
	HALT
	MOVE	X1,U1
	SKIPE	TRUNKF		;DO WE PRINT
	PUSHJ	PDP,TYO
	CAIN	U1,11		;LOOK FOR A TAB
	JRST	.+3		;ONE FOUND
	CAIE	U1,15		;LOOK FOR C.R.
	JRST	.-10		;NOT TIME TO STOP
	SKIPE	TRUNKF		;NOW END COMMENT
	PUSHJ	PDP,TERPRI
BOL1:	PUSHJ	PDP,MAGIN
	HALT
	CAIN	U1,11		;IGNORE SECOND TAB
	JRST	.-3
	MOVEM	U1,BORW#	;BLACK OR WHITE TO PLAY
	SETZ	U2,
	CAIN	U1,"D"
	JRST	BOL3
BOL2:	PUSHJ	PDP,MAGIN
	HALT
	CAIGE	U1,72
	CAIGE	U1,60
	JRST	BOL3
	IMULI	U2,12
	ADD	U2,U1
	SUBI	U2,60
	SETZ	U1,
	JRST	BOL2

BOL3:	MOVEM	U2,WINLOS
	PUSHJ	PDP,NEWLIN
	HALT
	JUMPE	U2,BOL4
	CAME	U1,BORW
	JRST	.+4
	TRNN	U2,1
	AOS	WINLOS
	JRST	.+3
	TRNE	U2,1
	AOS	WINLOS
BOL4:	MOVEI	Z,1
	CAIN	U1,"W"
	MOVEM	Z,COLOR
	CAIN	U1,"B"
	SETZM	COLOR
	PUSHJ	PDP,BDIN	;SET UP BOARD
	MOVE	A,U3
	PUSHJ	PDP,NEWLIN
	HALT
	PUSHJ	PDP,BDIN0
	MOVE	P,U3
	MOVE	K,U5
	MOVEM	A,TA
	MOVEM	P,TP
	MOVEM	K,TK
	MOVEI	U1,"TK"
	MOVEM	U1,LPOINT
	SETZ	X2,
	SETOM	X4VAR
	JRST	BEGIN2

X4VAR:	-1		;COUNT OF VARIATION BOARDS

BDIN:	SETZ	U5,
BDIN0:	SETZ	U3,
BDIN1:	HRLZI	U4,400000
	SETZ	U2,
BDIN2:	PUSHJ	PDP,MAGIN
	HALT
	CAIGE	U1,72
	CAIGE	U1,60
	JRST	BDIN3
	IMULI	U2,12
	ADD	U2,U1
	SUBI	U2,60
	SETZ	U1,
	JRST	BDIN2

BDIN3:	EXCH	U1,U2
	JUMPE	U1,BDIN4
	PUSHJ	PDP,OUTIN
	MOVNS	U1
	ROT	U4,(U1)
	TDO	U3,U4
	CAIE	U2,"K"
	JRST	.+3
	TDO	U5,U4
	JRST	BDIN1
BDIN4:	CAIN	U2,","
	JRST	BDIN1
	POPJ	PDP,

FIXX:	TTYUUO	11,0
	SETZM	LASCAR
	SETZM	FLAG#
	SETZM	FIXINS#
	MOVEI	U1,1
	SETZM	COLOR
	CAME	U1,SI
	AOS	COLOR
	SETZB	X3,X4
	MOVEM	A,PLA
	MOVEM	P,PLP
	MOVEM	K,PLK
	SETZM	OJ
	PUSHJ	PDP,LEGAL
	JRST	FIX1		;NO LEGAL MOVES
	AOS	OJ		;SET JUMP FLAG
	PUSHJ	PDP,X4NORM
	MOVEI	U1,[ASCIZ /LEGAL MOVES ARE:/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,LEGM	;REPORT LEGAL MOVES
	SETOM	BINDEX
	MOVEI	Z,1
	XORM	Z,COLOR		;COLOR IS REVERSED IN SAVMOV
	PUSHJ	PDP,SAVMOV
	MOVEI	Z,1
	XORM	Z,COLOR
	HLRZ	U1,BOOKI
	MOVEM	U1,FILEI2
	CAME	U1,FILEIN
	PUSHJ	PDP,GETFIL
	MOVE	U2,BOOKA
	MOVE	U3,BOOKP
	MOVE	U4,BOOKK
	PUSHJ	PDP,FINDX1
	JRST	NOFIND
	MOVEM	X1,X1S
	MOVEI	U1,[ASCIZ /LISTED MOVES ARE /]
	PUSHJ	PDP,PRINT
	MOVE	X1,X1S
	MOVE	X5,INPA(X1)
	PUSHJ	PDP,EXBITS
	PUSHJ	PDP,RPMOVE
	MOVE	X5,INPP(X1)
	PUSHJ	PDP,EXBITS
	SKIPE	BOOKK		;A KING BOARD
	JRST	FIXK		;YES
	JUMPE	X5,FIX6
	MOVEI	U1,[ASCIZ /,/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,RPMOVE
	JRST	FIX6

NOFIND:	MOVEM	X1,X1S
	MOVEI	U1,[ASCIZ /BOARD NOT FOUND, CR OR TYPE MOVE :/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	TTYUUO	11,0
	SETZM	LASCAR
	PUSHJ	PDP,SCAN
	CAIN	U1,12		;A LINE FEED
	JRST	.-2		;YES
	CAIN	U1,15		;A CR
	JRST	FIXOK
	SETOM	FIXINS		;SO NEW BOARD WILL BE INSERTED
	SETZM	BOOKM
	SETZM	BOOKM+1
	JRST	FIX8		;NOW GET MOVE

FIXK:	MOVE	Z,X5
	MOVE	X5,INPK(X1)
	PUSHJ	PDP,EXBITS
	LSH	Z,4
	IORB	X5,Z
	JUMPE	X5,FIXK2
	MOVEI	U1,[ASCIZ /, WIN-LOSS DISTANCE IS /]
	PUSHJ	PDP,PRINT
	MOVE	U1,X5
	PUSHJ	PDP,NUMOUT
	PUSHJ	PDP,TERPRI
	JRST	FIX6

FIXK2:	MOVEI	U1,[ASCIZ /, REPORTED AS A DRAW./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	FIX6

RPMOVE:	MOVEM	X5,X4
	JUMPN	X5,.+4
	MOVEI	U1,[ASCIZ /0-0/]
	PUSHJ	PDP,PRINT
	POPJ	PDP,
	SKIPN	COLOR
	JRST	.+7
	MOVEI	U1,1
	CAMN	X4,X4TAB(U1)
	JRST	.+3
	CAIGE	U1,17
	AOJA	U1,.-3
	MOVE	X4,U1
	SUBI	X4,1		;COUNT FROM ZERO
	MOVE	U3,MOVES(X4)
	JUMPN	U3,.+4
	MOVEI	U1,[ASCIZ /ILLEGAL/]
	PUSHJ	PDP,PRINT
	POPJ	PDP,
	HLRZ	U1,U3
	PUSHJ	PDP,NUMOUT
	MOVEI	U1,[ASCIZ /-/]
	PUSHJ	PDP,PRINT
	HRRZ	U1,U3
	PUSHJ	PDP,NUMOUT
	POPJ	PDP,

FIX1:	MOVEI	U1,[ASCIZ /NO LEGAL MOVES FOUND./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

FIX6:	TTYUUO	11,0
	SETZM	LASCAR
	PUSHJ	PDP,TERPRI
	PUSHJ	PDP,TERPRI
	MOVEI	U1,[ASCIZ /CR IF OK, OR ENTER MOVES WANTED/]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
FIX7:	PUSHJ	PDP,SCAN
	CAIN	U1,12		;A LINE FEED
	JRST	FIX7		;YES
	CAIN	U1,15		;A CR
	JRST	FIXOK
	SETZM	BOOKM
	SETZM	BOOKM+1
FIX8:	HRLZ	U2,U1		;START IN LEFT HALF
	PUSHJ	PDP,SCAN
	TLNE	U1,-1
	JRST	.+3
	PUSHJ	PDP,EOL
	JRST 	ERR
	HRR	U2,U1		;TERMINATION IN RIGHT HALF
	JUMPE	U2,NULL		;TO STORE NO-MOVE BOARD FOR TEST
	MOVEI	X4,20
	CAMN	U2,MOVES(X4)
	JRST	.+6
	SOJGE	X4,.-2
	MOVEI	U1,[ASCIZ /ILLEGAL MOVE. /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	FIX6
	ADDI	X4,1		;TO COUNT FROM 1
	SKIPE	COLOR
	MOVE	X4,X4TAB(X4)
	MOVEM	X4,BOOKM
	SKIPE	BOOKK
	JRST	FIX9K
	PUSHJ	PDP,SCAN
	CAIN	U1,15
	JRST	FIX11
	TLNE	U1,-1
	JRST	.+3
	PUSHJ	PDP,EOL
	JRST	ERR
	HRRZS	U1
	HRLZ	U2,U1
	PUSHJ	PDP,SCAN
	TLNE	U1,-1
	JRST	.+3
	PUSHJ	PDP,EOL
	JRST 	ERR
	HRR	U2,U1
	MOVEI	X4,20
	CAMN	U2,MOVES(X4)
	JRST	.+6
	SOJGE	X4,.-2
	MOVEI	U1,[ASCIZ /ILLEGAL SECOND MOVE, FIRST MOVE ONLY WILL BE USED. /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	FIX11
	ADDI	X4,1		;TO COUNT FROM 1
	SKIPE	COLOR
	MOVE	X4,X4TAB(X4)
	MOVEM	X4,BOOKM+1

FIX11:	MOVE	X1,X1S
	SKIPE	FIXINS		;IS BOARD IN TABLE
	JRST	INS4B		;NO SO INSERT
	MOVE	X1,X1S		;WE NEED THIS
FIX10:	HRRZ	X2,BOOKM
	PUSHJ	PDP,INBITS
	MOVE	U1,INPA(X1)
	AND	U1,[377377377377]
	IOR	U1,X2
	MOVEM	U1,INPA(X1)
	SKIPE	BOOKK
	JRST	FIX12
FIX13:	MOVE	X2,BOOKM+1
	PUSHJ	PDP,INBITS
	MOVE	U1,INPP(X1)
	AND	U1,[377377377377]
	IOR	U1,X2
	MOVEM	U1,INPP(X1)
	JRST	FIXZ

FIX12:	HLRZ	X2,BOOKM
	LSH	X2,-4
	PUSHJ	PDP,INBITS
	MOVE	U1,INPP(X1)
	AND	U1,[377377377377]
	IOR	U1,X2
	MOVEM	U1,INPP(X1)
	HLRZ	X2,BOOKM
	ANDI	X2,17
	PUSHJ	PDP,INBITS
	MOVE	U1,INPK(X1)
	AND	U1,[377377377377]
	IOR	U1,X2
	MOVEM	U1,INPK(X1)
	JRST	FIXZ

FIXOK:	MOVEI	U1,[ASCIZ /NO CHANGE MADE./]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,TERPRI
	JRST	.+2
FIXZ:	PUSHJ	PDP,DMPFIL
	PUSHJ	PDP,TERPRI
	SETOM	BINDEX		;TO OVERWRITE TRASH
	POPJ	PDP,
ACCEPT:	PUSHJ	PDP,TERPRI
	SETZM	U5
	TTYUUO	11,0
	SETZM	LASCAR
	MOVEI	U1,[ASCIZ /BLACK PIECES ON: /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,ACC		;READ IN BLACK PIECES
	MOVEM	U3,OA		;STORE BLACK PIECES
	MOVEI	U1,[ASCIZ /WHITE PIECES ON: /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,ACC		;NOW READ IN WHITE PIECES
	MOVEI	U1,[ASCIZ /BLACK TO PLAY? /]
	PUSHJ	PDP,PRINT
	MOVEI	U1,1
	MOVEM	U1,SI
	PUSHJ	PDP,NOYES
	AOSA	SI
	JRST	.+3		;BLACK IS TO PLAY
	EXCH	U3,OA
	SETZM	SIDE
	MOVEM	U3,OP		;STORE WHITE PIECES
	MOVEM	U5,OK
	MOVE	A,OA
	MOVEM	A,PLA
	MOVE	P,OP
	MOVEM	P,PLP
	MOVE	K,OK
	MOVEM	K,PLK
	PUSHJ	PDP,TERPRI
	JRST	FIXX

ACC:	SETZM	U3
ACC1:	HRLZI	U4,400000
ACC2:	PUSHJ	PDP,SCAN
	CAIN	U1,15		;CR?
	POPJ	PDP,		;YES
	TLZE	U1,400000	;NUMBER?
	JRST	ACC3		;YES
	HRRZS	U1		;GET RID OF LEFT HALF FLAG BITS
	CAIN	U1,K		;IF A KING ...
	TDO	U5,U4		; ... SET KING BIT
	JRST	ACC1
ACC3:	PUSHJ	PDP,OUTIN	;CONVERT TO INTERNAL NUMBERS
	MOVNS	U1
	ROT	U4,(U1)		;ROTATE TO BIT'S POSITION
	TDO	U3,U4		;SET PIECE'S BIT
	JRST	ACC2

LEGM:	SETZM	FLAG
	MOVEI	X4,17
	SETZM	MOVES(X4)	;CLEAR SPACE
	SOJGE	X4,.-1
	SETZ	X4,
	MOVEI	U3,4
	SKIPE	U2,PLRF
	PUSHJ	PDP,LEGM1
	MOVEI	U3,5
	SKIPE	U2,PLLF
	PUSHJ	PDP,LEGM1
	MOVNI	U3,4
	SKIPE	U2,PLLB
	PUSHJ	PDP,LEGM1
	MOVNI	U3,5
	SKIPE	U2,PLRB
	PUSHJ	PDP,LEGM1
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

LEGM1:	MOVEI	U4,↑D35
	TRNE	U2,1
	JRST	.+4
	LSH	U2,-1
	SOJG	U4,.-3
	POPJ	PDP,
	MOVEI	U1,[ASCIZ /,/]
	SKIPE	FLAG
	PUSHJ	PDP,PRINT
	MOVE	U1,U4
	PUSHJ	PDP,INOUT
	HRLZM	U5,MOVES(X4)
	MOVEI	U1,[ASCIZ /-/]
	PUSHJ	PDP,PRINT
	MOVE	U1,U4
	ADD	U1,U3
	SKIPE	OJ
	ADD	U1,U3
	PUSHJ	PDP,INOUT
	HRRM	U5,MOVES(X4)
	AOS	FLAG
	AOS	X4
	JRST	LEGM1+3

INOUT:	CAIL	U1,↑D27
	SOS	U1
	CAIL	U1,↑D18
	SOS	U1
	CAIL	U1,↑D9
	SOS	U1
	MOVEM	U1,U5
	PUSHJ	PDP,NUMOUT
	POPJ	PDP,

EXBITS:	LSHC	X5,-11		;EXTRACT GUARD BITS
	LSH	X5,-10
	LSHC	X5,-1
	LSH	X5,-10
	LSHC	X5,-1
	LSH	X5,-10
	LSHC	X5,3
	POPJ	PDP,

FIXIN:	MOVE	X1,X1S
	PUSHJ	PDP,INS4C		;MUST INSERT LINE
	SKIPE	BOOKM+1		;IS THERE ANOTHER MOVE
	JRST	FIX13
	PUSHJ	PDP,DMPFIL
	PUSHJ	PDP,TERPRI
	POPJ	PDP,

FIX9K:	MOVEI	U1,[ASCIZ /[CR FOR DRAW OR TYPE WIN-LOSS DISTANCE /]
	PUSHJ	PDP,PRINT
	TTYUUO	11,0
	SETZM	LASCAR
	PUSHJ	PDP,SCAN
	CAIN	U1,12
	JRST	.-2
	CAIE	U1,15
	HRLM	U1,BOOKM
	JRST	FIX11

NULL:	MOVEI	U1,[ASCIZ /0-0 STORES A NO-MOVE BOARD. DO YOU WANT THIS. Y OR N: /]
	PUSHJ	PDP,PRINT
	PUSHJ	PDP,NOYES
	JRST	FIX6		;TRY AGAIN
	JRST	FIX11		;STORE NO-MOVE BOARD

OA:	Z
OP:	Z
OK:	Z

MOVES:	BLOCK	20		;SPACE FOR LEGAL MOVES

	END